【问题标题】:insert a file after a specific line在特定行之后插入文件
【发布时间】:2013-06-02 04:59:02
【问题描述】:

我想使用 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。

【问题讨论】:

标签: regex bash vim sed awk


【解决方案1】:

这可能对你有用(GNU sed):

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

【讨论】:

  • 谢谢potong,你能告诉我这个命令是如何工作的吗?
  • @chaitanya 这个命令说下面的行2 读取(r)文件sample.txt 的文件input.txt 并将输出定向到output.txt
【解决方案2】:

一种使用的方式

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

【讨论】:

    【解决方案3】:

    awk

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

    说明:

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

    【讨论】:

    • 感谢 Jaypal,您能帮我理解您使用的 awk 命令吗?
    • @chaitanya 添加了一些解释。希望对您有所帮助。
    • 我认为将在第二行之后的每一行插入文件( NR ==3 )只会做一次
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多