sed替换文件直到模式匹配

时间:2015-01-20 13:15:12

标签: sed

我使用sed对文件中的标题进行简单替换。 有时他们需要更换,有时不需要。 它工作正常,但很长,因为它每次都读取文件(数百MB)。 但是,有一种模式可以将标题与内容分开。

如何在遇到某种模式后告诉sed停止处理文件?

示例:

我想在这里编辑的blabla标题,但可能不是FRAME更多内容

假设想要从标题中删除“want”,但该单词可能在或可能不在所述标题中。我知道我想停止在FRAME处理文件。

sed -i '0,/\(pattern1\|pattern2\)/s//pattern1/' * ; # TODO stop at FRAME

2 个答案:

答案 0 :(得分:1)

您可以使用awk

awk '/pattern stop/ {f=1} !f {sub(/old data/,"new data")} 1' file

只要找不到old data,这会将pattern stop替换为“新数据”。

将数据写回原始文件:

awk 'code'  file > tmp && mv tmp file

答案 1 :(得分:1)

您可以使用q命令退出处理其余输入的sed

sed -i '0,/\(pattern1\|pattern2\)/s//pattern1/' * ; /FRAME/q'
  • /FRAME/模式匹配包含FRAME的行q已被执行的行

您可以指定从文件开头到遇到FRAME

的地址范围
sed '0, /FRAME/ s/old/new'