替换 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

对于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/

您可以看到,.*实际上是先捕获的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之前匹配超出.,作为停止标记。
在其他情况下,您可能需要找到另一个定位点。
在此处查看更多内容。

最新更新