Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 替换html参数内的模式_Regex_Linux_Sed - Fatal编程技术网

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,理解它的悲哀,第一次使用stackoverflowUsing
echo'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"