如何使用Sed交换文件中的/mount/m07与/m07字符串?
解决sed交换两个字符串时互相覆盖的问题
嘿,我懂你碰到的麻烦了——直接连续替换"/mount/m07"和"/m07"的时候,第一个替换后的内容会被第二个命令误匹配,导致最终两个字符串都变成同一个值。解决这个问题的核心思路是先用临时占位符“暂存”其中一个字符串,避免互相干扰,具体的sed命令如下:
sed -e 's/"\/mount\/m07/"TEMP_MARKER/g' -e 's/"\/m07/"\/mount\/m07/g' -e 's/"TEMP_MARKER/"\/m07/g' file_name
命令分步解释:
- 第一步:把所有的
"/mount/m07"替换成临时标记"TEMP_MARKER",这样后续替换"/m07"时,不会影响到原本的"/mount/m07"内容 - 第二步:把所有的
"/m07"替换成目标值"/mount/m07" - 第三步:把临时标记
"TEMP_MARKER"替换成"/m07",完成两者的交换
测试验证:
用你提供的示例内容测试:
原始内容:
filesystem special="/abc/ca97" raw="/abc/ca97" directory="/mount/m07" filesystem special="/abc/d1107" raw="/abc/d1107" directory="/m07"
执行命令后会输出:
filesystem special="/abc/ca97" raw="/abc/ca97" directory="/m07" filesystem special="/abc/d1107" raw="/abc/d1107" directory="/mount/m07"
完全符合你的预期需求。
如果想要直接修改原文件(原地编辑),可以加上-i参数(GNU sed):
sed -i -e 's/"\/mount\/m07/"TEMP_MARKER/g' -e 's/"\/m07/"\/mount\/m07/g' -e 's/"TEMP_MARKER/"\/m07/g' file_name
注意:BSD sed(比如macOS系统)需要写成-i '',避免生成备份文件。
内容的提问来源于stack exchange,提问作者Sandy
相关产品推荐
相关产品推荐

