gpt4 book ai didi

linux - sed:替换标记之间的文本 block ,包括标记本身

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:14 25 4
gpt4 key购买 nike

我有以下 sed 命令,用开始和结束标记 /**#@+**#@-* 之间的文件内容替换文本 block 分别为:

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 命令中。

测试.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 中最短的单行解决方案。

最佳答案

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

sed '/^\/\*\*#@+/,/^\/\*\*#@-\*/cThis is the replacement' file

这会将范围之间的行更改为所需的字符串。

要用文件内容替换范围,请使用:

sed -e '/^\/\*\*#@+/!b;:a;N;/^\/\*\*#@-\*/M!ba;r replacementFile' -e 'd' file

在遇到范围的开始时设置一个循环以收集模式空间中的范围,然后将替换文件读入标准输出并删除模式空间的内容。

关于linux - sed:替换标记之间的文本 block ,包括标记本身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42273250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com