4

我正在尝试使用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不会偷懒。

谢谢你。

4

5 回答 5

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
于 2013-02-01T20:22:26.090 回答
1

怎么样:

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

阅读更多关于ranges 这里

于 2013-02-01T20:11:54.783 回答
1

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

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

于 2013-02-01T21:40:09.913 回答
1

这可能对您有用(GNU sed):

sed '/START/!b;:a;/END/bb;$!{N;ba};:b;s/START.*END//' file
于 2013-02-01T23:06:46.960 回答
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
于 2013-02-02T14:46:30.320 回答