首页 > 解决方案 > Shell 脚本:仅在第一次出现指定模式后才在文件中插入多行。(图案出现多次)

问题描述

我想使用 shell 脚本在文件中插入多行。让我们考虑一下我的原始文件:original.txt:

aaa
bbb
ccc
aaa
bbb
ccc
aaa
bbb
ccc
.
.
.

和我的插入文件:toinsert.txt

111
222
333

现在,只有在“original.txt”文件中第一次出现“ccc”行之后,我才必须从“toinsert.txt”文件中插入三行。注意:“ccc”模式在我的“original.txt”文件中出现了不止一次。仅在模式第一次出现后插入后,我的文件应更改如下:

aaa
bbb
ccc
111
222
333
aaa
bbb
ccc
aaa
bbb
ccc
.
.
.

我应该使用 shell 脚本进行上述插入。有人能帮我吗?

注2:我发现了一个类似的案例,有部分解决方案:

sed -i -e '/ccc/r toinsert.txt' original.txt

它实际上多次插入(每次出现 ccc 模式时)。

标签: bashshellseded

解决方案


这可能对您有用(GNU sed):

sed '0,/ccc/!b;/ccc/r insertFile' file

使用范围:

如果当前行在第一次出现之后的范围内ccc,则中断进一步处理并像往常一样隐式打印。

否则,如果当前行确实包含ccc,则从 插入行insertFile

注意 这使用0允许正则表达式出现在第 1 行的地址,并且特定于 GNU sed。

或者:

sed -e '/ccc/!b;r insertFile' -e ':a;n;ba' file

使用循环:

如果一行不包含ccc,则不进行进一步处理并照常打印。

否则,插入行insertFile,然后使用循环,获取/打印剩余的行,直到文件末尾。

注意 该r命令坚持用换行符与其他 sed 命令分隔。该-e选项模拟了这种效果,因此 sed 命令分为两个-e选项。

或者:

sed 'x;/./{x;b};x;/ccc/!b;h;r insertFile' file

使用标志:

如果保持空间不为空(标志已设置),则不再进行进一步处理并照常打印。

否则,如果该行不包含ccc,则不进行进一步处理并照常打印。

否则,将当前行复制到保留空间(设置标志)并从insertFile.

注意在所有情况下,该r命令都会insertFile在打印当前行之后插入行。


推荐阅读