我在一些我需要修改的文件中有一些html链接:
<a href="www.blah.edu/hello world of friends" class="blue">Hello World</a>
假设上述链接位于test.txt中。
我一直试图在href链接中用下划线替换来替换空格。所以
<a href="www.blah.edu/hello world of friends" class="blue">Hello World</a>
需要
<a href="www.blah.edu/hello_world_of_friends" class="blue">Hello World</a>
就我所知,使用sed:
sed '/href=['"'"'"][^"'"'"']*['"'"'"]*"/{s;\s;_;g}' test.txt
当然,这会产生:
<a_href="www.blah.edu/hello_world"_class="blue">Hello_World</a>
我明白为什么会这样做。 / regex / bit将整行拉入模式空间,然后s ;;;在整行上执行,而不仅仅是我需要的位。
如何仅在 href = 和“中用空格替换下划线?有没有更好的方法来考虑这个而不是使用sed?
答案 0 :(得分:1)
我为此选择了perl:您可以将代码放入替换部件并进行评估。
perl -pe 's{(?<=href=")(.+?)(?=")}{ (my $x = $1) =~ s/\s/_/g; $x }ge' <<END
<a href="www.blah.edu/hello world of friends" class="blue">Hello World</a>
END
<a href="www.blah.edu/hello_world_of_friends" class="blue">Hello World</a>
有一些解释:
perl -pe '
s{
(?<=href=") # starting where the preceding text is: href="
(.+?) # find a non-greedy sequence of chars until
(?=") # the closing quote is next.
}{
(my $x = $1) =~ s/\s/_/g; # replace whitespace with underscore
$x # and replace with the new value
}gex
'
答案 1 :(得分:1)
您可以使用GNU Awk或Mawk:
awk 'BEGIN { RS = "href=\""; ORS = ""; FS = OFS = "\"" } NR > 1 { gsub(/ /, "_", $1); print RS } 1' file
输出:
<a href="www.blah.edu/hello_world_of_friends" class="blue">Hello World</a>