sed 不识别匹配组
sed not recognizing matched group
我正在尝试从目录中的所有 pdf 文件中打印出一个子字符串。我似乎无法让 sed 使用它。正则表达式是正确的,但是当我使用 \1
时 sed 出错
for old in ./*.pdf; do
new=$(echo $old | sed -e 's/(\.\/)?\d+_(\w\w\-\d+).+//')
echo $new
done
我正在使用 sed (GNU sed) 4.4
输出为:
sed: -e expression #1, char 32: invalid reference on `s' command's
RHS
对于目录中的每个文件...
谢谢!
您可以使用
sed -E 's/(\.\/)?[0-9]+_[A-Z][A-Z]-[0-9]+.+//'
请注意,sed
不支持 PCRE 正则表达式,因此,\d
和 \w
在这里只是简单的无效构造。要匹配任何字母,您可以使用 [:alpha:]
POSIX 字符 class,或者如果您希望匹配大写字母,请使用 [:upper:]
.
而不是 \d
,使用 [0-9]
或 [:digit:]
。
在 BRE POSIX 模式中,(
和 )
表示文字括号,这就是为什么您收到错误消息说您不能引用任何捕获组值的原因 - 有none 在模式中定义。要使未转义的括号在 POSIX BRE 模式中创建一个组,您需要对它们进行转义,或者 - 如果您使用 POSIX ERE 模式(sed
与 -r
或 -E
选项),你可以使用它们未转义。
同样适用于 +
量词:在 POSIX BRE 模式中它应该转义,在 ERE 模式中,可以不转义使用它。
此外,您不需要使用第二个捕获组,因为您没有在替换中使用
。
我正在尝试从目录中的所有 pdf 文件中打印出一个子字符串。我似乎无法让 sed 使用它。正则表达式是正确的,但是当我使用 \1
时 sed 出错for old in ./*.pdf; do
new=$(echo $old | sed -e 's/(\.\/)?\d+_(\w\w\-\d+).+//')
echo $new
done
我正在使用 sed (GNU sed) 4.4
输出为:
sed: -e expression #1, char 32: invalid reference on `s' command's RHS
对于目录中的每个文件...
谢谢!
您可以使用
sed -E 's/(\.\/)?[0-9]+_[A-Z][A-Z]-[0-9]+.+//'
请注意,sed
不支持 PCRE 正则表达式,因此,\d
和 \w
在这里只是简单的无效构造。要匹配任何字母,您可以使用 [:alpha:]
POSIX 字符 class,或者如果您希望匹配大写字母,请使用 [:upper:]
.
而不是 \d
,使用 [0-9]
或 [:digit:]
。
在 BRE POSIX 模式中,(
和 )
表示文字括号,这就是为什么您收到错误消息说您不能引用任何捕获组值的原因 - 有none 在模式中定义。要使未转义的括号在 POSIX BRE 模式中创建一个组,您需要对它们进行转义,或者 - 如果您使用 POSIX ERE 模式(sed
与 -r
或 -E
选项),你可以使用它们未转义。
同样适用于 +
量词:在 POSIX BRE 模式中它应该转义,在 ERE 模式中,可以不转义使用它。
此外,您不需要使用第二个捕获组,因为您没有在替换中使用 。