我要替换这个
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版
答案 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 --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是因为正则表达式的 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。