使用Bash在特定行之前插入文本

时间:2012-09-03 13:24:35

标签: bash shell

如何在第一个地方找到一个字符串的文件中插入一组行(约5个)?

例如:

BestAnimals.txt

dog
cat
dolphin
cat

$“在cat之前将长颈鹿插入BestAnimals.txt”> NewBestAnimals.txt

NewBestAnimals.txt

dog
giraffe 
cat
dolphin
cat

5 个答案:

答案 0 :(得分:9)

如果使用gnu sed:

$ cat animals
dog
cat
dolphin
cat

$ sed  "/cat/ { N; s/cat\n/giraffe\n&/ }" animals
dog
giraffe
cat
dolphin
cat
  1. 与(/ cat /)
  2. 匹配一行
  3. 继续下一行(N)
  4. 将匹配的模式替换为插入和匹配的字符串,其中&表示匹配的字符串。

答案 1 :(得分:2)

如果您知道(或以某种方式找出)该行:

sed -n '/cat/=' BestAnimals.txt

您可以使用sed:

sed -i '2i giraffe' BestAnimals.txt

答案 2 :(得分:2)

awk解决方案:

awk '/cat/ && c == 0 {c = 1; print "giraffe"}; {print}' \
     BestAnimals.txt

如果要插入的动物在" MyOtherBestAnimals.txt"你也可以做

awk '/cat/ && c == 0 {c = 1; system("cat MyOtherBestAnimals.txt") }; {print} ' \
     BestAnimals.txt

这个答案基本上可以分解如下,因为;分隔了awk条件 - 动作对:

  • /cat/ && c == 0 { c = 1; ... }在包含cat的第一行将c设置为1。然后执行...处的命令,但只执行一次,因为c现在为1。
  • {print}是没有条件的动作打印:打印任何输入行。这是在上述条件 - 动作对之后完成的。

取决于...的实际内容,打印长颈鹿,或者#34; MyOtherBestAnimals.txt"在打印包含" cat"。

的第一行之前,将被发送到标准输出

修改

在分析了@glenn jackman的解决方案后,似乎仍然可以改进此解决方案:使用输入文件时

nyan cat
cat

数据附加在nyan cat之前,而不是在等于cat的行之前。然后解决方案是要求整行等于cat

awk '$0 == "cat" && c == 0 {c = 1; print "giraffe"}; {print}' \
     BestAnimals.txt

用于插入单行和

awk '$0 == "cat" && c == 0 {c = 1; system("cat MyOtherBestAnimals.txt") }; {print} ' \
     BestAnimals.txt

用于插入文件

答案 3 :(得分:2)

awk -v insert=giraffe -v before=cat '
  $1 == before && ! inserted {
    print insert
    inserted++
  }
  {print}
' BestAnimals.txt > NewBestAnimals.txt

答案 4 :(得分:0)

我会:

  1. 使用grep查找第一场比赛的行号
  2. 使用head获取前往比赛的文字
  3. 使用cat
  4. 插入新内容
  5. 使用tail获取匹配后的行
  6. 既不快速,高效也不优雅。但它非常直接,如果文件不是很大和/或你需要每秒多次这样做,那应该没问题。