4

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

例如:

最佳动物.txt

dog
cat
dolphin
cat

$ "在猫之前插入长颈鹿到 BestAnimals.txt" > NewBestAnimals.txt

NewBestAnimals.txt

dog
giraffe 
cat
dolphin
cat
4

5 回答 5

11

如果使用 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. 继续下一行 (N)
  3. 用插入和匹配的字符串替换匹配的模式,其中&表示匹配的字符串。
于 2012-09-03T13:38:00.487 回答
3
awk -v insert=giraffe -v before=cat '
  $1 == before && ! inserted {
    print insert
    inserted++
  }
  {print}
' BestAnimals.txt > NewBestAnimals.txt
于 2012-09-03T18:55:12.223 回答
2

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

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

您可以使用 sed:

sed -i '2i giraffe' BestAnimals.txt
于 2012-09-03T13:29:53.783 回答
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}是无条件的操作打印:打印任何输入行。这是在上述条件-动作对之后完成的。

根据实际情况...,打印 giraffe,或将“MyOtherBestAnimals.txt”的内容发送到标准输出,然后打印包含“cat”的第一行。

编辑

经过@glenn jackman 的解决方案分析,看来这个解决方案还是可以改进的:when using input file

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

用于插入文件

于 2012-09-03T13:53:36.183 回答
0

我会:

  1. 用于grep查找第一个匹配的行号
  2. 用于head获取导致匹配的文本
  3. 使用插入新内容cat
  4. 用于tail获取比赛后的线路

它既不快速、高效也不优雅。但这很简单,如果文件不是很大和/或您需要每秒执行多次,那应该没问题。

于 2012-09-03T13:27:18.630 回答