替换html参数中的模式

时间:2019-01-24 07:56:37

标签: regex linux sed

我要替换这个

href="//noname.com/basil/armada/joke.pdf" href="//noname.com/family/hello.pdf" 

使用

href="//noname.com/arid/joke.pdf" href="//noname.com/arid/hello.pdf" 

-这只是我正在使用的大文件的伪代码,因此我无法手工完成。
-一切都在1行中,所以我相信我只能使用替代命令
-甚至可以用sed吗?

我尝试过

sed '/href/s#//noname.com.*(armada|family)?#//noname.com/arid#g' < list.html > list2.html

但是什么都没有被替换......?

我正在使用GNU sed 4.7版

1 个答案:

答案 0 :(得分:3)

对于GNU sed

$ echo 'href="//noname.com/basil/armada/joke.pdf" href="//noname.com/family/hello.pdf" ' | sed -r '/href/s#//noname.com/(basil/armada|family)#//noname.com/arid#g'
href="//noname.com/arid/joke.pdf" href="//noname.com/arid/hello.pdf"

在这种情况下,您可以使用-E-r。 (-E在系统之间更兼容)
您也忘记了basil/ ...
请检查sed --helpman sed

更新,怎么这样:

$ echo 'href="//noname.com/basil/armada/joke.pdf" href="//noname.com/family/hello.pdf" ' | sed -r '/href="..noname.com/s#(armada|family)#arid#g'
href="//noname.com/basil/arid/joke.pdf" href="//noname.com/arid/hello.pdf"

您可以将..更改为\/\/以确保准确性。

如果您不想保留basil部分...
您在注释中的命令仅留下一个URL是因为正则表达式的 greedy 模式,请检查以下内容:

$ echo 'href="//noname.com/basil/armada/joke.pdf" href="//noname.com/family/hello.pdf" ' | sed -r '/href/s#href....noname.com/(.*)(armada|family).*#\1#g'
basil/armada/joke.pdf" href="//noname.com/

您可以看到,.*实际上是第一个捕获的basil下一个 family之前。
因此,我们需要找到一种方法来阻止正则表达式过于贪婪,例如:

$ echo 'href="//noname.com/basil/armada/joke.pdf" href="//noname.com/family/hello.pdf" ' | sed -r '/href/s#//noname.com/[^.]*(armada|family)#//noname.com/arid#g'
href="//noname.com/arid/joke.pdf" href="//noname.com/arid/hello.pdf"

[^.]表示不是.的任何字符,在这种情况下,避免正则表达式匹配.之前的pdf以外的字符作为停止标记。
在其他情况下,您可能需要找到另一个锚点。
检查更多here