Linux bash如何根据其他行的模式匹配替换指定行的字符串?
错误原因分析
你原有命令的核心逻辑存在问题:只要当前行不匹配^REF\*ZZ\*SO规则,就会触发x;s/ST\*850\*/ST\*850C\*/;x逻辑,不管该ST对应的块里有没有匹配SO的REF行,所有ST行都会被替换,不符合你只替换命中块的需求。
正确实现方案
正确的sed逻辑需要按块缓存ST到下一个ST/文件结尾之间的内容,命中REF规则时才修改缓存里的ST行,命令如下:
sed -i '/^ST\*850/{x;/./p;x;h;b}; /^REF\*ZZ\*SO/{x;s/ST\*850/ST\*850C/;x}; H; $!b; $x;p' file
命令逻辑说明
- 遇到
ST*850开头的行时,先把之前缓存的块内容输出,再把当前ST行存入hold空间,跳过后续逻辑处理下一行 - 遇到
REF*ZZ*SO开头的行时,取出hold空间的内容,把ST*850替换为ST*850C后再存回hold空间 - 其他普通行直接追加到hold空间缓存
- 读到文件最后一行时,把剩余缓存的块内容输出
运行后输出和你给出的预期结果完全一致。
内容的提问来源于stack exchange,提问作者user3152289
相关产品推荐
相关产品推荐

