如何将sed更改限制为第一组

时间:2016-06-15 19:54:49

标签: sed

我有一个文本文件,其中包含如下所示的条目。

tag1start
text1
text2
text3
text4
tag1end
..
..
tag1start
text5
text6
text7
text8
tag1end

我只需要在tag1start tag1end的第一个集中更改条目

我尝试过使用" range"但它会影响两组。我如何仅将其限制在第一组?

/tag1start/,/tag1end/c\
Some other text1\
Some other text2\
Some other text3\
Some other text4\
Some other text5\
Some other text6\
tag1end

2 个答案:

答案 0 :(得分:3)

sed '/tag1end/,$!{1,/tag1start/!s/\(.*\)/Some other \1\\/;}'

粗略翻译:在所有之外,从tag1end到最后一行的部分(贪婪,是第一个tag1end之后的所有部分),执行以下操作:在所有中除从第1行到tag1start的部分,将foo转换为Some other foo\

答案 1 :(得分:2)

考虑:

$ sed '/tag1end/,${p;d}; /tag1start/,/tag1end/{s/^/Some other /}' file
Some other tag1start
Some other text1
Some other text2
Some other text3
Some other text4
tag1end
..
..
tag1start
text5
text6
text7
text8
tag1end

如何运作

  • /tag1end/,${p;d}

    对于从匹配tag1end的第一行到$的范围内的所有行,按原样打印该行(p)并从下一行重新开始( d)。

  • /tag1start/,/tag1end/{s/^/Some other /}

    如果我们尚未到达第一个tag1end,我们只能使用此命令。如果我们尚未达到tag1end并且我们在/tag1start/,/tag1end/范围内,则执行花括号中的命令。您可以在这些大括号中添加您喜欢的任何sed命令。