首页 > 解决方案 > 替换html参数中的模式

问题描述

我想换这个

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 版

标签: regexlinuxsed

解决方案


对于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 ,请检查:

$ 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/

可以看到,.*实际捕获的 firstbasilnext 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"

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


推荐阅读