如何在找到字符串的第一个位置将一组行(大约 5 行)插入文件中?
例如:
最佳动物.txt
dog
cat
dolphin
cat
$ "在猫之前插入长颈鹿到 BestAnimals.txt" > NewBestAnimals.txt
NewBestAnimals.txt
dog
giraffe
cat
dolphin
cat
如果使用 gnu sed:
$ cat animals
dog
cat
dolphin
cat
$ sed "/cat/ { N; s/cat\n/giraffe\n&/ }" animals
dog
giraffe
cat
dolphin
cat
&
表示匹配的字符串。awk -v insert=giraffe -v before=cat '
$1 == before && ! inserted {
print insert
inserted++
}
{print}
' BestAnimals.txt > NewBestAnimals.txt
如果您知道(或以某种方式找到)该行:
sed -n '/cat/=' BestAnimals.txt
您可以使用 sed:
sed -i '2i giraffe' BestAnimals.txt
一个 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
用于插入文件
我会:
grep
查找第一个匹配的行号head
获取导致匹配的文本cat
tail
获取比赛后的线路它既不快速、高效也不优雅。但这很简单,如果文件不是很大和/或您需要每秒执行多次,那应该没问题。