我想替换这个
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 --help
或man 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
之前匹配超出.
,作为停止标记。
在其他情况下,您可能需要找到另一个定位点。
在此处查看更多内容。