替换所有出现的字符串

时间:2016-10-19 11:44:02

标签: regex replace sed

我试图替换所有出现的字符串:

https://support.office.com/en-us/article/Check-for-accessibility-issues-a16f6de0-2f39-4a2b-8bd8-5ad801426c7f?ui=en-US&rs=en-US&ad=US

xyz。这是针对当前目录下的所有文件完成的。

我使用了以下命令:

find . -type f | xargs sed -i 's/https\:\/\/support\.office\.com\/en\-us\/article\/Check\-for\-accessibility\-issues\-a16f6de0\-2f39\-4a2b\-8bd8\-5ad801426c7f\?ui\=en\-US\&rs\=en\-US\&ad\=US/xyz/g';

但它没有做任何事。我认为我逃避特殊角色的方式是错误的。我该如何纠正?

现在,我使用\为每个非字母数字字符添加前缀。

4 个答案:

答案 0 :(得分:2)

您可以使用其他分隔符,例如~,并避免转义sed命令中的大多数符号。

尝试此命令:

find . -type f -exec sed -i 's~https://support\.office\.com/en-us/article/Check-for-accessibility-issues-a16f6de0-2f39-4a2b-8bd8-5ad801426c7f?ui=en-US&rs=en-US&ad=US~xyz~g' '{}' +

即使?也不需要在BRE中进行转义,因为它与文字?匹配。

答案 1 :(得分:1)

sed默认使用BRE,你转义了一些字符,这在BRE中具有特殊含义,例如,\?并不意味着文字?,而是意味着,zero or one occurrence < / p>

您应该调整转义..或使用sed中/以外的分隔符。

...sed 's@http://foo?bar@xyz@g` 

答案 2 :(得分:1)

如果perl没问题,请查看quotemeta

$ cat ip.txt 
https://support.office.com/en-us/article/Check-for-accessibility-issues-a16f6de0-2f39-4a2b-8bd8-5ad801426c7f?ui=en-US&rs=en-US&ad=US

$ perl -pe 's|\Qhttps://support.office.com/en-us/article/Check-for-accessibility-issues-a16f6de0-2f39-4a2b-8bd8-5ad801426c7f?ui=en-US&rs=en-US&ad=US|xyz|' ip.txt 
xyz


并使用exec选项代替xargs

find -type f -exec perl -i -pe 'print "$ARGV" if s|\Qhttps://support.office.com/en-us/article/Check-for-accessibility-issues-a16f6de0-2f39-4a2b-8bd8-5ad801426c7f?ui=en-US&rs=en-US&ad=US|xyz|' {} +

答案 3 :(得分:0)

尝试了它没有工作

sed的@ wp-content / plugins / bwp-minify / min /?f = wp-content / plugins / share-this / css / style.css,wp-content / plugins / wp-to-twitter / CSS / Twitter的feed.css,可湿性粉剂内容/主题/ yourgarden / style.css中,可湿性粉剂内容/插件/聪明,待办事项列表/ CSS /聪明,待办事项列表,frontend.css,WP-内容/插件/聪明,待办事项列表/ CSS / jQuery的UI-fresh.css?的wp-content / CSS / all.css @” sed:-e表达式#1,char 344:未终止的`s'命令