使用Bash在某一行之前插入文本

使用Bash在某一行之前插入文本,bash,shell,Bash,Shell,如何将一组行(大约5行)插入文件的第一个位置找到字符串 例如: BestAnimals.txt dog cat dolphin cat dog giraffe cat dolphin cat $“将长颈鹿插入猫之前的BestAnimals.txt”>newestAnimals.txt dog cat dolphin cat dog giraffe cat dolphin cat NewBestAnimals.txt dog cat dolphin cat dog giraffe

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

例如:

BestAnimals.txt

dog
cat
dolphin
cat
dog
giraffe 
cat
dolphin
cat
$“将长颈鹿插入猫之前的BestAnimals.txt”>newestAnimals.txt

dog
cat
dolphin
cat
dog
giraffe 
cat
dolphin
cat
NewBestAnimals.txt

dog
cat
dolphin
cat
dog
giraffe 
cat
dolphin
cat
我想:

  • 使用
    grep
    查找第一个匹配的行号
  • 使用
    head
    获取匹配前的文本
  • 使用
    cat
  • 使用
    tail
    获取匹配后的行
  • 它既不快,效率也不高。但是这是非常简单的,如果文件不是很大,或者你需要一秒钟做很多次,那应该没问题。

    如果你知道(或者以某种方式找到)这行:

    sed -n '/cat/=' BestAnimals.txt
    
    您可以使用sed:

    sed -i '2i giraffe' BestAnimals.txt
    
    如果使用gnu sed:

    $ cat animals
    dog
    cat
    dolphin
    cat
    
    $ sed  "/cat/ { N; s/cat\n/giraffe\n&/ }" animals
    dog
    giraffe
    cat
    dolphin
    cat
    
  • 将一行与(/cat/)匹配
  • 继续下一行(N)
  • 用插入和匹配的字符串替换匹配的模式,其中
    &
    表示匹配的字符串
  • awk解决方案:

    awk '/cat/ && c == 0 {c = 1; print "giraffe"}; {print}' \
         BestAnimals.txt
    
    如果要插入的动物位于“myotherbestanies.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}
      是无条件打印的操作:打印任何输入行。这是在上述条件动作对之后完成的
    根据
    ,在打印包含“cat”的第一行之前,将打印长颈鹿,或将“myotherbestanies.txt”的内容发送到标准输出

    编辑

    在分析了@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
    

    对于文件的插入

    我只是想自动化一项无聊的任务,因为我是一名计算机科学家,所以速度并不重要,大约有500个文件!没错,我应该补充一句。更新。例如,如果首先出现
    nyan cat
    行,则会出现问题是,但这不是问题的一部分;-)从最简单的解决方案开始,也就是亲吻,然后当问题出现时,从那里开始——这是真的!我刚刚向你提出了解决这个问题的办法。我还发现了另一个问题:
    cat
    的第一次出现不能在最后一行。不知道如何解决这个问题!它们都是有效的解决方案,但你首先回答了,所以被接受了。你如何处理多个单词?我得到sed:-e表达式#1,char 4:命令后的额外字符OP想要在cat之前而不是dog之后插入定义两个变量
    insert
    ,它取变量
    之前的值“giraffe”和dito。对于每行:如果第一个WS-separated标记(例如“dog”)与变量
    之前的内容匹配,并且插入的变量未定义,则打印变量
    插入
    ,即。“长颈鹿。增量插入变量,以便后续匹配不会产生打印。最后,所有行的默认操作是打印,即输出输入行。来自@glennjackman先生的漂亮解决方案一如既往:-)
    awk -v insert=giraffe -v before=cat '
      $1 == before && ! inserted {
        print insert
        inserted++
      }
      {print}
    ' BestAnimals.txt > NewBestAnimals.txt