sed - 替换一行中的字符

时间:2014-07-28 17:25:53

标签: regex sed

我在一些我需要修改的文件中有一些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?

2 个答案:

答案 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>