使用 SED 删除模式以外的任何内容
Using SED to Remove Anything but a Pattern
我有一堆。 pdf文件名。例如:
901201_HKW_RNT_HW21_136_137_DE_442_Freigabe_DE_CLX.pdf
我正在尝试删除除此模式之外的所有内容 XXX_XXX,其中 X 始终是数字。
结果应该是:
136_137
到目前为止我做了相反的事情..通过使用来匹配模式:
set NoSpacesString to do shell script "echo " & quoted form of insideName & " | sed 's/([0-9][0-9][0-9]_[0-9][0-9][0-9])//'"
我的目标是将 NoSpaceString 设置为 136_137
请提供一点帮助。
谢谢!
P.S。如果这很重要,其余代码在 AppleScript 中
正在修复 sed
命令...
你可以使用
sed -n 's/.*\([0-9]\{3\}_[0-9]\{3\}\).*//p'
详情
-n
- 抑制默认行输出
s/.*\([0-9]\{3\}_[0-9]\{3\}\).*//
- 找到匹配的 .*\([0-9]\{3\}_[0-9]\{3\}\).*
模式
.*
- 任意零个或多个字符
\([0-9]\{3\}_[0-9]\{3\}\)
- 第1组(右标中的</code>指的是该组值):三位数,<code>_
,三位数
.*
- 任意零个或多个字符
p
- 仅打印替换结果。
上面的正则表达式是 POSIX BRE 兼容模式。同样可以写成POSIX ERE:
sed -En 's/.*([0-9]{3}_[0-9]{3}).*//p'
最终 AppleScript 代码
set noSpacesString to do shell script "sed -En 's/.*([0-9]{3}_[0-9]{3}).*/\1/p' <<<" & insideName's quoted form
这可能对你有用 (GNU sed):
sed -E '/\n/{P;D};s/[0-9]{3}_[0-9]{3}/\n&\n/;D' file
此解决方案将在单独的行上打印所有出现的模式。
初始命令取决于后面的内容。
第二个命令替换所需的模式,在两侧添加换行符。
D
命令删除第一个换行符,但由于模式 space 不为空,重新启动 sed 循环(不追加下一行)。
现在初始命令开始起作用了。打印该行的前面,然后将其与其附加的换行符一起删除。
再次重新启动 sed 循环,就好像该行从未出现过一样,但减去了直到并包括第一个所需模式的所有字符。
重复这种触发器控制模式,直到什么都不剩下,然后在后续行上重复,直到文件结束。
以下是调试日志的副本,其中包含所需模式的两种表示形式的合适的单行输入:
SED PROGRAM:
/\n/ {
P
D
}
s/[0-9]{3}_[0-9]{3}/
&
/
D
INPUT: 'file' line 1
PATTERN: aaa123_456bbb123_456ccc
COMMAND: /\n/ {
COMMAND: }
COMMAND: s/[0-9]{3}_[0-9]{3}/
&
/
MATCHED REGEX REGISTERS
regex[0] = 3-10 '123_456'
PATTERN: aaa\n123_456\nbbb123_456ccc
MATCHED REGEX REGISTERS
regex[0] = 0-3 'aaa'
PATTERN: \n123_456\nbbb123_456ccc
COMMAND: D
PATTERN: 123_456\nbbb123_456ccc
COMMAND: /\n/ {
COMMAND: P
123_456
COMMAND: D
PATTERN: bbb123_456ccc
COMMAND: /\n/ {
COMMAND: }
COMMAND: s/[0-9]{3}_[0-9]{3}/
&
/
MATCHED REGEX REGISTERS
regex[0] = 3-10 '123_456'
PATTERN: bbb\n123_456\nccc
MATCHED REGEX REGISTERS
regex[0] = 0-3 'bbb'
PATTERN: \n123_456\nccc
COMMAND: D
PATTERN: 123_456\nccc
COMMAND: /\n/ {
COMMAND: P
123_456
COMMAND: D
PATTERN: ccc
COMMAND: /\n/ {
COMMAND: }
COMMAND: s/[0-9]{3}_[0-9]{3}/
&
/
PATTERN: ccc
MATCHED REGEX REGISTERS
regex[0] = 0-3 'ccc'
PATTERN:
COMMAND: D
我有一堆。 pdf文件名。例如:
901201_HKW_RNT_HW21_136_137_DE_442_Freigabe_DE_CLX.pdf
我正在尝试删除除此模式之外的所有内容 XXX_XXX,其中 X 始终是数字。 结果应该是:
136_137
到目前为止我做了相反的事情..通过使用来匹配模式:
set NoSpacesString to do shell script "echo " & quoted form of insideName & " | sed 's/([0-9][0-9][0-9]_[0-9][0-9][0-9])//'"
我的目标是将 NoSpaceString 设置为 136_137
请提供一点帮助。 谢谢!
P.S。如果这很重要,其余代码在 AppleScript 中
正在修复 sed
命令...
你可以使用
sed -n 's/.*\([0-9]\{3\}_[0-9]\{3\}\).*//p'
详情
-n
- 抑制默认行输出s/.*\([0-9]\{3\}_[0-9]\{3\}\).*//
- 找到匹配的.*\([0-9]\{3\}_[0-9]\{3\}\).*
模式.*
- 任意零个或多个字符\([0-9]\{3\}_[0-9]\{3\}\)
- 第1组(右标中的</code>指的是该组值):三位数,<code>_
,三位数.*
- 任意零个或多个字符
p
- 仅打印替换结果。
上面的正则表达式是 POSIX BRE 兼容模式。同样可以写成POSIX ERE:
sed -En 's/.*([0-9]{3}_[0-9]{3}).*//p'
最终 AppleScript 代码
set noSpacesString to do shell script "sed -En 's/.*([0-9]{3}_[0-9]{3}).*/\1/p' <<<" & insideName's quoted form
这可能对你有用 (GNU sed):
sed -E '/\n/{P;D};s/[0-9]{3}_[0-9]{3}/\n&\n/;D' file
此解决方案将在单独的行上打印所有出现的模式。
初始命令取决于后面的内容。
第二个命令替换所需的模式,在两侧添加换行符。
D
命令删除第一个换行符,但由于模式 space 不为空,重新启动 sed 循环(不追加下一行)。
现在初始命令开始起作用了。打印该行的前面,然后将其与其附加的换行符一起删除。
再次重新启动 sed 循环,就好像该行从未出现过一样,但减去了直到并包括第一个所需模式的所有字符。
重复这种触发器控制模式,直到什么都不剩下,然后在后续行上重复,直到文件结束。
以下是调试日志的副本,其中包含所需模式的两种表示形式的合适的单行输入:
SED PROGRAM:
/\n/ {
P
D
}
s/[0-9]{3}_[0-9]{3}/
&
/
D
INPUT: 'file' line 1
PATTERN: aaa123_456bbb123_456ccc
COMMAND: /\n/ {
COMMAND: }
COMMAND: s/[0-9]{3}_[0-9]{3}/
&
/
MATCHED REGEX REGISTERS
regex[0] = 3-10 '123_456'
PATTERN: aaa\n123_456\nbbb123_456ccc
MATCHED REGEX REGISTERS
regex[0] = 0-3 'aaa'
PATTERN: \n123_456\nbbb123_456ccc
COMMAND: D
PATTERN: 123_456\nbbb123_456ccc
COMMAND: /\n/ {
COMMAND: P
123_456
COMMAND: D
PATTERN: bbb123_456ccc
COMMAND: /\n/ {
COMMAND: }
COMMAND: s/[0-9]{3}_[0-9]{3}/
&
/
MATCHED REGEX REGISTERS
regex[0] = 3-10 '123_456'
PATTERN: bbb\n123_456\nccc
MATCHED REGEX REGISTERS
regex[0] = 0-3 'bbb'
PATTERN: \n123_456\nccc
COMMAND: D
PATTERN: 123_456\nccc
COMMAND: /\n/ {
COMMAND: P
123_456
COMMAND: D
PATTERN: ccc
COMMAND: /\n/ {
COMMAND: }
COMMAND: s/[0-9]{3}_[0-9]{3}/
&
/
PATTERN: ccc
MATCHED REGEX REGISTERS
regex[0] = 0-3 'ccc'
PATTERN:
COMMAND: D