Bash 使用sed/awk一次替换多行中的文本

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/

我有一个非常大的(~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/.*/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