使用sed进行惰性查找和替换多行

时间:2013-02-01 20:01:03

标签: sed

我正在尝试使用sed从文件中删除html代码块。要删除的块在文件中出现多次,并且还跨越多行。另外注意到该块具有不同的内容,但具有明确的开始和结束描述。

我已尝试了多种方法来实现这一点,并且遇到了在sed中进行懒惰并且跨行匹配的问题。

以下是我正在尝试做的一个例子:

good stuff a
good stuff same line START
bad stuff 1.0
bad stuff 1.1
END
good stuff b
good stuff b
good stuff same line START bad stuff 2.0
bad stuff 2.0
END
good stuff c

变为:

good stuff a
good stuff same line
good stuff b
good stuff b
good stuff same line
good stuff c

到目前为止,我尝试了一些方法。

sed -n '1h;1!H;${;g;s/START.*END//mg;p;}' < test > test2获取有效的行。

sed -n 's/START[^END]*END//g' < test > test2仅取消E或N或D.

sed -n 's/START.*?END//g' < test > test2不会表现得懒惰。

谢谢。

5 个答案:

答案 0 :(得分:2)

sed不适合处理多线输入。 请改用awk 你想为它的正则表达式匹配一行,如果它是你的'坏'块的开头,则关闭打印。以下是您的文件示例:

$ awk '
BEGIN    { pr = 1; }
/^START/  { pr = 0; }
          { if (pr) print; }
/^END/    { pr = 1; }
' < yourfile
good stuff a
good stuff b
good stuff b
good stuff c

答案 1 :(得分:1)

怎么样:

$ sed '/START/,/END/d' file.txt
good stuff a
good stuff b
good stuff b
good stuff c

详细了解ranges here

答案 2 :(得分:1)

一个sed可能很难做到这一点。两个sed使它变得微不足道:

sed 's/START/\nSTART\n/g' | sed '/START/,/END/d'

答案 3 :(得分:1)

这可能适合你(GNU sed):

sed '/START/!b;:a;/END/bb;$!{N;ba};:b;s/START.*END//' file

答案 4 :(得分:0)

sed是一个很好的工具,可以在一行上进行简单的替换,对于其他任何使用awk的东西:

$ awk 'sub(/START.*|.*END/,""){f=!f;if(NF)print;next} !f' file
good stuff a
good stuff same line
good stuff b
good stuff b
good stuff same line
good stuff c