在特定行之后插入文件

时间:2013-06-06 08:58:03

标签: regex bash vim sed awk

我想使用shell脚本在文件中的某个特定位置插入一些文本,例如在文件的第3行。

我有一个输入文件:

input.txt
---------
Apple
Orange
Cat
Dog

和另一个示例文件:

sample.txt
-----------
Sample data1
Sample data2

现在我的输出文件应该是:

output.txt
----------
Apple
Orange
Sample data1
Sample data2
Cat
Dog

我编写了一个脚本,但它只能放在文件的开头:

#!/bin/bash
if grep  "Text exists..." "./input.txt"; then
echo exist
else
   echo doesNOTexist
   cat sample.txt >> output.txt
   cat input.txt >> output.txt
fi

请帮助我如何在某个特定位置插入行而不是文件的开头或结尾。

我正在使用带有bash shell的UNIX。

3 个答案:

答案 0 :(得分:4)

awk

awk 'NR>2{while((getline a < "sample.txt") > 0){print a}}1' input.txt

阐释:

  • NRawk内置变量,用于存储行号。当我们将条件NR>2放在后面的action时,该条件只有在它为真时才会执行。也就是说,另一个文件的行只会在主文件的第二行之后开始显示。
  • 如果捕获了行,则getline函数的返回值为1,如果到达文件末尾,则返回0。
  • while(..)循环与getline一起使用将意味着继续此循环,直到使用getlineprint获取整个文件。
  • 最后的1基本上是一个非零值,告诉awk执行默认操作print

答案 1 :(得分:3)

这可能适合你(GNU sed):

sed '2rsample.txt' input.txt >output.txt

答案 2 :(得分:0)

使用

的一种方法

script.vim的内容:

set backup
n
normal ggyG
N
normal 3GP
saveas output.txt
qa!

像以下一样运行:

vim -S script.vim input.txt sample.txt

它会创建一个内容为output.txt的内容:

Apple
Orange
Sample data1
Sample data2
Cat
Dog