Bash 使用sed/awk一次替换多行中的文本
我有一个非常大的(~60MB)文本文件,我想用预定义的文本替换特定的块行。每个块(3行)开始的行号已知,并存储在文件中:Bash 使用sed/awk一次替换多行中的文本,bash,awk,sed,Bash,Awk,Sed,我有一个非常大的(~60MB)文本文件,我想用预定义的文本替换特定的块行。每个块(3行)开始的行号已知,并存储在文件中: ... 11 30 42 58 ... 我知道我可以使用以下选项来替换块: sed -i "Xs,(X+3)s/.*/REPLACEMENT/" filename.txt 但是,在for循环中执行此命令,如: for line in $(cat linenumbers.txt); do eline=$((${line}+3)) sed -i "Xs,(X+3)s/
...
11
30
42
58
...
我知道我可以使用以下选项来替换块:
sed -i "Xs,(X+3)s/.*/REPLACEMENT/" filename.txt
但是,在for循环中执行此命令,如:
for line in $(cat linenumbers.txt); do
eline=$((${line}+3))
sed -i "Xs,(X+3)s/.*/REPLACEMENT/" filename.txt
done
速度非常慢,需要花费大量时间(>10'),我有100个文件需要替换块。
有没有其他方法可以指导sed一次性完成这项工作
awk
救援
$ awk 'NR==FNR {start[$1]; next}
FNR in start {c=3}
c&&c-- {print "replacement"; next}1' indices file
这是一个一次性过程,您可以将输出保存到一个新文件中,并根据需要覆盖原始文件。类似于@karakfas answer,但对您的需求有不同的解释(提示:使用输入和输出的实际示例可以消除混淆): 这可能适用于您(GNU-sed):
将行号文件转换为sed脚本,并针对数据文件运行它。pos替换前后输入文件的实际和可测试片段
awk '
NR==FNR { start[$1]; next }
FNR in start { print "replacement"; c=3 }
c&&c-- { next }
{ print }
' indices file
sed 's/.*/&,+3cREPLACEMENT/' lineNumbersFile | sed -f - file