sed 替换文件直到模式匹配

sed replace in file until pattern match

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

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

示例:

blabla header我想在这里编辑但可能不会在这里添加更多内容

假设要从 header 中删除 "want",但该词可能在也可能不在所述 header 中。我知道我想在 FRAME 停止处理文件。

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

您可以使用awk

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

只要找不到 pattern stop,就会用 "new data" 替换 old data

要将数据写回原始文件:

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

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

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

您可以指定从文件开头到遇到 FRAME 的地址范围,如

sed '0, /FRAME/ s/old/new'