繁体   English   中英

Bash:如何在Unix中将特定行后的文本块插入文件?

[英]Bash : How to insert a block of text after a certain line into a file in Unix?

我有一个文件file1.txt如下所示:

line 1 file 1
line 2 file 1
line 3 file 1
line 4 file 1

和第二个文件file2.txt如下:

line 1 file 2
line 2 file 2
line 3 file 2
line 4 file 2
line 5 file 2

我想要一行命令(最好用sed)从第二个文件(file2.txt)获取第2-4行,并将第3行之后的行添加到第一个文件(file1.txt)中。

所以我的输出应该如下:

line 1 file 1
line 2 file 1
line 3 file 1
line 2 file 2
line 3 file 2
line 4 file 2
line 4 file 1

为了从第二个文件中获取2-4行,我可以使用:

sed -n '2,4p' file2.txt

并且为了在文件1中的第3行之后插入行,我可以使用如下:

sed '4i<What to insert here>' file1.txt

但是如何将这两种操作结合​​起来呢?

同意另一个回答者这是awk的工作,可以用sed来完成。

除了着名的s命令之外, sed提供了所有类型的奇怪命令,并且有一个用于GNU sed的e执行命令。 在您提出问题的所有部分之后,以下是如何结合您的想法:

sed '4 e sed -n 2,4p file2.txt' file1.txt 

ed是一个编辑器,可以就地保存文件:

ed file1.txt <<END
3a
$(sed -n 2,4p file2.txt)
.
wq
END

GNU awk可以就地保存:

gawk -i inplace -v text="$(sed -n 2,4p file2.txt)" '1; NR==3 {print text}' file1.txt

你可以使用awk:

awk 'FNR==NR{if (FNR>=2 && FNR <=4) s=(s==""?$0:s RS $0); next} FNR==4{print s} 1' f2 f1

line 1 file 1
line 2 file 1
line 3 file 1
line 2 file 2
line 3 file 2
line 4 file 2
line 4 file 1

说明:

NR == FNR {                  # While processing the 2nd file
  if (FNR>=2 && FNR <=4)     # for line # 2 to 4
    s=(s==""?$0:s RS $0      # store each line in variable s separated by newline
  next
}
FNR==4 {                     # while processing the 1st file if line # is 4
  print s                    # print stored text from variable s
}
1                            # default action to print each line from file1

这是AWK的工作,但是sed这样的东西可以在bash中工作:

sed '3r '<(sed -n '2,4p;5q' file2) file1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM