我正在尝试从目录中的所有pdf文件打印出一个子字符串。我似乎无法使用它。正则表达式是正确的,但是当我使用\ 1时sed会出错
for old in ./*.pdf; do
new=$(echo $old | sed -e 's/(\.\/)?\d+_(\w\w\-\d+).+/\1/')
echo $new
done
1,但我使用(GNU但是)4.4
输出是:
sed:-e表达式#1,char 32:`s'命令的RHS上的无效引用\ 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
。