我正在尝试使用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
不会表现得懒惰。
谢谢。
答案 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