如何在第一个地方找到一个字符串的文件中插入一组行(约5个)?
例如:
BestAnimals.txt
dog
cat
dolphin
cat
$“在cat之前将长颈鹿插入BestAnimals.txt”> NewBestAnimals.txt
NewBestAnimals.txt
dog
giraffe
cat
dolphin
cat
答案 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 :(得分: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)
我会:
grep
查找第一场比赛的行号head
获取前往比赛的文字cat
tail
获取匹配后的行既不快速,高效也不优雅。但它非常直接,如果文件不是很大和/或你需要每秒多次这样做,那应该没问题。