bash - 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 模式时)。
解决方案
这可能对您有用(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
在打印当前行之后插入行。
推荐阅读
- javascript - 从 Fetch API (JavaScript) 检索特定对象 - 重新发布
- reactjs - 无法为 react-contenteditable 创建 ReasonML 绑定
- python - 作为参数传递时,如何跨多个自定义函数处理 Pandas DataFrame?
- amazon-web-services - Lambda 可以承担具有认知用户 ID 条件的 IAM 角色吗?
- sql - Laravel 定义两个表之间的关系
- azure - 在 Azure 中获取域验证 ID 的 customDomainVerificationId 在哪里
- python - 无法在烧瓶中编辑 mongodb 文档
- arrays - c语言结构中的数组赋值
- reactjs - 不能将属性从一个组件传递到另一个组件
- java - 如果您想在测试时使用 assertThrows,您应该使用存根还是模拟?