Shell 脚本:仅在指定模式首次出现后才将多行插入文件。 (图案出现多次)
Shell script: Insert multiple lines into a file ONLY after a specified pattern appears for the FIRST time. (The pattern appears multiple times)
我想使用 shell 脚本将多行插入到一个文件中。让我们考虑一下我的原始文件:original.txt:
aaa
bbb
ccc
aaa
bbb
ccc
aaa
bbb
ccc
.
.
.
和我的插入文件:toinsert.txt
111
222
333
现在我必须仅在 'ccc' 行首次出现在 'original.txt' 文件中之后才插入 '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 模式)。
使用 ed
,而不是 sed
来编辑文件:
printf "%s\n" "/ccc/r toinsert.txt" w | ed -s original.txt
它在包含 ccc
的第一行之后插入另一个文件的内容,但与您的 sed
版本不同,它仅在第一行之后。
这可能适合您 (GNU sed):
sed '0,/ccc/!b;/ccc/r insertFile' file
使用范围:
如果当前行在第一次出现 ccc
之后的范围内,则停止进一步处理并像往常一样隐式打印。
否则,如果当前行包含 ccc
,则插入来自 insertFile
.
的行
N.B。这使用地址 0
允许正则表达式出现在第 1 行并且特定于 GNU sed。
或:
sed -e '/ccc/!b;r insertFile' -e ':a;n;ba' file
使用循环:
如果一行不包含ccc
,则不再进一步处理并照常打印。
否则,从 insertFile
插入行,然后使用循环 fetch/print 剩余的行,直到文件末尾。
N.B。 r
命令坚持用换行符与其他 sed 命令分隔开。 -e
选项模拟这种效果,因此 sed 命令分为两个 -e
选项。
或:
sed 'x;/./{x;b};x;/ccc/!b;h;r insertFile' file
使用标志:
如果hold space不为空(标志位已经设置),则不做进一步处理,照常打印。
否则,如果该行不包含ccc
,则不会进一步处理并照常打印。
否则,将当前行复制到保留 space(设置标志)并插入来自 insertFile
.
的行
N.B。在所有情况下,r
命令在打印当前行后插入来自 insertFile
的行。
我想使用 shell 脚本将多行插入到一个文件中。让我们考虑一下我的原始文件:original.txt:
aaa
bbb
ccc
aaa
bbb
ccc
aaa
bbb
ccc
.
.
.
和我的插入文件:toinsert.txt
111
222
333
现在我必须仅在 'ccc' 行首次出现在 'original.txt' 文件中之后才插入 '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 模式)。
使用 ed
,而不是 sed
来编辑文件:
printf "%s\n" "/ccc/r toinsert.txt" w | ed -s original.txt
它在包含 ccc
的第一行之后插入另一个文件的内容,但与您的 sed
版本不同,它仅在第一行之后。
这可能适合您 (GNU sed):
sed '0,/ccc/!b;/ccc/r insertFile' file
使用范围:
如果当前行在第一次出现 ccc
之后的范围内,则停止进一步处理并像往常一样隐式打印。
否则,如果当前行包含 ccc
,则插入来自 insertFile
.
N.B。这使用地址 0
允许正则表达式出现在第 1 行并且特定于 GNU sed。
或:
sed -e '/ccc/!b;r insertFile' -e ':a;n;ba' file
使用循环:
如果一行不包含ccc
,则不再进一步处理并照常打印。
否则,从 insertFile
插入行,然后使用循环 fetch/print 剩余的行,直到文件末尾。
N.B。 r
命令坚持用换行符与其他 sed 命令分隔开。 -e
选项模拟这种效果,因此 sed 命令分为两个 -e
选项。
或:
sed 'x;/./{x;b};x;/ccc/!b;h;r insertFile' file
使用标志:
如果hold space不为空(标志位已经设置),则不做进一步处理,照常打印。
否则,如果该行不包含ccc
,则不会进一步处理并照常打印。
否则,将当前行复制到保留 space(设置标志)并插入来自 insertFile
.
N.B。在所有情况下,r
命令在打印当前行后插入来自 insertFile
的行。