【发布时间】:2017-02-16 11:55:31
【问题描述】:
我有以下 sed 命令,它们分别用开始和结束标记 /**#@+ 和 **#@-* 之间的文件内容替换文本块:
sed -i -ne '/**#@+/ {p; r block.txt' -e ':a; n; /**#@-*/ {p; b}; ba}; p' -e '/**#@+/d' test.txt && sed -i -e '/**#@+/d' -e '/**#@-*/d' test.txt
(除了替换文本外,该命令还转换行尾。)
事实上,这使开始和结束标记保持不变,但我也想摆脱它们。 My using the p command means that I can't have a d command in the same execution unit。我通过引入第二组删除这些标记的命令来解决该问题,但如果可能的话,我希望将所有这些都包含在一个 sed 命令中。
test.txt
start of file
/**#@+
* the start marker is above
*/
this should get replaced
/**#@-*/
end marker is above
block.txt
THIS IS THE REPLACEMENT
结果
运行命令应该像这样改变 test.txt:
start of file
THIS IS THE REPLACEMENT
end marker is above
我正在寻找 sed 中最短的单行解决方案。
【问题讨论】:
-
请添加示例输入/输出以进行测试
-
你想让我们试穿什么?一个示例文件会很有帮助。
-
我已经从正则表达式中删除了行结束位并包含示例输入、输出和替换文件
-
p命令只打印模式空间中的内容,它们对程序流程没有影响。d删除模式空间并结束程序流程,d之后的任何命令都不会被执行(除非b或t命令被定向到d命令之后的:占位符)。 -
@potong 感谢您的解释,很好学习