Sed-无效的前置正则表达式

时间:2019-09-13 13:35:14

标签: arrays regex bash unix sed

我对sed代码有疑问。 我不想在这里做

来自

uri.csv
/path/file.jpg
/path/file2.bmp

收件人

/path/*.jpg
/path/*.bmp

我使用此代码是因为我用sed查看错误。

sed -r 's/(.+\/).+?(?=\.)(.+)/\\1*\\2/g' uri.csv
sed: -e expression #1, char 31: Invalid preceding regular expression

你能帮我吗?

2 个答案:

答案 0 :(得分:1)

您所使用的POSIX ERE不支持解决方法(通过-r选项启用)。

您的正则表达式最多匹配一个或多个字符,最多/(使用(.+\/)),然后将最少1个以上的字符与.+?匹配,然后(?=\.)只需要一个.就可以立即出现在右侧,并且(.+)会尽可能多地将1个以上的字符捕获到组2中。

您可以使用

sed -r 's,(.*/)?.*\.,\1*.,' uri.csv

或者,使用-E选项:

sed -E 's,(.*/)?.*\.,\1*.,' uri.csv

或使用POSIX BRE:

sed 's@\(.*/\)\{0,1\}.*\.@\1*.@' uri.csv

请参见online sed demo

注意:使用,作为分隔符时,不需要转义/字符。

答案 1 :(得分:0)

您不能将Look Around与sed一起使用。最好使用单线:

$ perl -pe 's/(.+\/).+?(?=\.)(.+)/$1*$2/g' file
/etc/designs/smartpos/images/*.svg
/etc/designs/smartpos/images/*.svg
相关问题