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'
我使用 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'