macos - 如果前一行与另一个文本匹配,则替换文件中的文本
问题描述
我的文件如下所示:
FooBarA
foo bar
foo = bar
FooBarB
foo bar
foo = bar
FooBarC
foo bar
foo = bar
...
我想做的是编写一个脚本来替换bar
infoo = bar
但前提是它属于FooBarB
. 所以在上面的例子中,只有第二bar
行foo = bar
应该被替换。
我玩过,sed
但我就是不能把它做好。我还想避免安装任何不一定预先安装在系统上的工具(我在 Mac OS 上),因为其他团队成员也将使用该脚本。
解决方案
这可能对您有用(GNU sed):
sed '/FooBarB/{:a;n;/^$/b;/foo = bar/!ba;s//foo = baz/}' file
匹配字符串FooBarB
并开始循环。
取出下一行并研究它。
如果该行为空,则该节已完成,因此请跳出循环。
如果该行不包含 string foo = bar
,则获取下一行并继续循环。
否则,用新值替换bar
并结束循环。
替代方案(可能适用于 macOS 用户?):
sed -e '/FooBarB/{:a' -e 'n;/^$/b;/foo = bar/!ba;s//foo = baz/;}' file
由于OP将输入数据更改为另一个解决方案的问题:
sed '/FooBar/h;G;/FooBarB/s/foo = bar/foo = baz/;P;d' file
推荐阅读
- commodore - 如何重新定位 65816 上的零页面
- haskell - Haskell - 列表理解中嵌套生成器的意外结果
- python - 如何在新终端中运行导入的模块 [Python]
- firebase - 任务':app:checkDebugDuplicateClasses'执行失败。,执行com.android.build.gradle.internal.tasks.CheckDuplica时发生故障
- kotlin - 可以是字符串或字符串数组的字段的 Kotlin 序列化
- android - 未解决的参考:它
- vagrant - 我可以在 Vagrant Trigger 中设置命令的顺序吗?
- haskell - 使用 Template Haskell 生成带有助手的新类型包装器
- r - R基于另一列绘制颜色
- python-3.x - 错误:“NoneType”对象在 python 中不可下标