使用Bash在某一行之前插入文本
如何将一组行(大约5行)插入文件的第一个位置找到字符串 例如: BestAnimals.txt使用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
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
&
表示匹配的字符串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