不认识匹配组

时间:2018-06-11 13:17:42

标签: bash sed git-bash

我正在尝试从目录中的所有pdf文件中打印出一个子字符串。我似乎无法使用它。正则表达式是正确的,但是当我使用\ 1

时,sed会出错
for old in ./*.pdf; do
    new=$(echo $old | sed -e 's/(\.\/)?\d+_(\w\w\-\d+).+/\1/')
    echo $new
done

我正在使用sed(GNU sed)4.4

输出结果为:

  

sed:-e expression#1,char 32:`s'命令的无效引用\ 1   RHS

目录中的每个文件......

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用

sed -E 's/(\.\/)?[0-9]+_[A-Z][A-Z]-[0-9]+.+/\1/'

请注意sed不支持PCRE正则表达式,因此\d\w只是普通的无效结构。要匹配任何字母,您可以使用[:alpha:] POSIX字符类,或者如果您希望匹配大写字母,请使用[:upper:]

而不是\d,请使用[0-9][:digit:]

在BRE POSIX模式中,()表示文字括号,这就是为什么你得到一个错误,说你不能引用任何捕获组值 - 模式中没有定义。要使未转义的括号在POSIX BRE模式中创建一个组,您需要转义它们,或者 - 如果您使用POSIX ERE模式(sed-r-E选项),可能会使用未转义的。

同样适用于+量词:在POSIX BRE模式中,它应该以ERE模式转义,可以将其转义为非转义。

此外,您不需要使用第二个捕获组,因为您没有在替换中使用\2