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

时间:2017-11-17 14:58:48

标签: bash awk sed

我有一个非常大(~60MB)的文本文件,我希望用预定义的文本替换特定的行。每个块(3行)开始的行号是已知的,它们存储在文件中:

sort -r -t\; -k1,1 -k3 file | uniq -w1 | grep "B" | cut -f2 -d\; 

我知道我可以使用以下选项来替换块:

...
11
30
42
58
...

但是,在for循环中执行此命令,如:

sed -i "Xs,(X+3)s/.*/REPLACEMENT/" filename.txt

非常慢并且需要花费大量时间(> 10')并且我有100个文件,其中我必须替换块。 有没有其他方法可以指示sed一次性完成这项工作?

3 个答案:

答案 0 :(得分:1)

awk救援!

$ awk 'NR==FNR      {start[$1]; next} 
       FNR in start {c=3} 
       c&&c--       {print "replacement"; next}1' indices file

这是一次性过程,您可以将输出保存到新文件中,并根据需要覆盖原始文件。

答案 1 :(得分:0)

类似于@karakfas的答案,但对您的要求有不同的解释(提示:输入和输出的实际示例可以消除混淆):

awk '
    NR==FNR      { start[$1]; next } 
    FNR in start { print "replacement"; c=3 } 
    c&&c--       { next }
    { print }
' indices file

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed 's/.*/&,+3cREPLACEMENT/' lineNumbersFile | sed -f - file

将行号文件转换为sed脚本并对数据文件运行。