使用SED删除模式以外的任何内容

使用SED删除模式以外的任何内容,sed,applescript,Sed,Applescript,我有一大堆。pdf文件名。例如: 901201_HKW_RNT_HW21_136_137_DE_442_Freigabe_DE_CLX.pdf 我试着把所有的东西都去掉,除了这个图案,其中X总是一个数字。 结果应该是: 136_137 到目前为止,我做的正好相反。。通过使用以下各项来匹配模式: set NoSpacesString to do shell script "echo " & quoted form of insideName & " |

我有一大堆。pdf文件名。例如:

901201_HKW_RNT_HW21_136_137_DE_442_Freigabe_DE_CLX.pdf

我试着把所有的东西都去掉,除了这个图案,其中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

请帮我一点忙。 谢谢大家!


另外,如果这很重要,则代码的其余部分在AppleScript中

修复
sed
命令…

你可以用

sed-n的/*\([0-9]\{3\}[0-9]\{3\}\)./\1/p'

细节

  • -n
    -抑制默认行输出
  • s/*\([0-9]\{3\}[0-9]\{3\}.*/\1/
    -查找匹配的
    *\([0-9]\{3\}.
    模式
    • *
      -任何零个或多个字符
    • \([0-9]\{3\}[0-9]\{3\}\)
      -第1组(RHS中的
      \1
      指的是该组值):三位,
      \uu
      ,三位
    • *
      -任何零个或多个字符
  • p
    -仅打印替换结果
上面的正则表达式是符合POSIX BRE的模式。POSIX ERE中也可以这样写:

sed-En's/*([0-9]{3}{0-9]{3})。*/\1/p'
最终AppleScript代码

set noSpacesString to do shell script“sed-En's/*([0-9]{3}{[0-9]{3})。*/\\1/p'这可能适合您(GNU-sed):

此解决方案将在单独的行上打印所有出现的图案

初始命令取决于以下内容

第二个命令将替换所需的模式,将换行符添加到任意一侧

D
命令最多删除第一行换行符,但由于模式空间不为空,因此会重新启动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

因此,可以使用
mv“${file}”“$(sed命令…).pdf重命名pdf“
当引用
s
命令的替换部分(即
\1
部分)中的组值时,在转换为AppleScript语法时,需要另外转义反斜杠。”。最后一个翻译成AppleScript的ERE示例是:
set noSpacesString to do shell script“sed-En的/*([0-9]{3}{0-9]{3})。*/\\1/p'@RobC感谢您提供了在AppleScript环境中实现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