Regex 替换html参数内的模式
我想换这个Regex 替换html参数内的模式,regex,linux,sed,Regex,Linux,Sed,我想换这个 href="//noname.com/basil/armada/joke.pdf" href="//noname.com/family/hello.pdf" 与 -这只是我正在处理的一个大文件的伪代码,所以我不能手工操作 -所有内容都在一行中,因此我相信我只能使用替换命令 -sed是否也可以这样做? 我试过了 sed '/href/s#//noname.com.*(armada|family)?#//noname.com/arid#g' < list.html > l
href="//noname.com/basil/armada/joke.pdf" href="//noname.com/family/hello.pdf"
与
-这只是我正在处理的一个大文件的伪代码,所以我不能手工操作-所有内容都在一行中,因此我相信我只能使用替换命令
-sed是否也可以这样做?
我试过了
sed '/href/s#//noname.com.*(armada|family)?#//noname.com/arid#g' < list.html > list2.html
sed'/href/s#//noname.com.*(armada | family)?#//noname.com/andry#g'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
到下一个系列
因此,我们需要找到一种方法来阻止正则表达式过于贪婪,例如:
$ 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
之前的
作为停止标记进行匹配。
在其他情况下,您可能需要找到另一个锚。
查看更多信息。@Tiw将其更新为包含sed版本。您正在使用扩展正则表达式的替代品armada |系列。因此,您需要使用-r
标志。另请参见:我建议使用-E
而不是-r
,因为现在它更便于携带。我还使用了```.``来弥补basil/
,因为在实际文件中,两者之间有很长的距离。不仅仅是basil/
Like,理解它的悲哀,第一次使用stackoverflowUsingecho'href=“//noname.com/basil/armada/joke.pdf”href=“//noname.com/family/hello.pdf””| sed-E'/href/s#//noname.com/adriad#g'href=“///noname.com/adriad/hello.pdf”
适用于最后一个href,但删除第一个我不想在输出中使用的basil
。我觉得我需要使用*
。在我们使用*
@Tiw的地方,有什么方法可以做到这一点吗
$ 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"