使用 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'

online demo

详情

  • -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