如何使用sed或awk删除所有紧跟bar(仅空白分隔)的foo且不改变空白格式?
如何使用sed或awk删除所有紧跟bar(仅空白分隔)的foo且不改变空白格式?
嘿,这个需求我太熟了,刚好可以用sed或者awk轻松搞定,而且完全不会破坏原来的空白布局,给你两种方案参考:
用sed实现
sed的正则替换就能精准匹配并处理,核心思路是捕获foo和bar之间的空白部分,然后把"foo+空白"替换成"空白",这样就只删掉了目标foo,空白完全保留。
执行命令:
# GNU sed 或支持扩展正则的sed sed -E 's/foo([[:space:]]+)bar/\1bar/g' 你的文件名.txt
如果是macOS等使用BSD sed的环境,需要把括号转义:
sed 's/foo\([[:space:]]\+\)bar/\1bar/g' 你的文件名.txt
- 解释一下:
[[:space:]]+匹配一个或多个空白字符(空格、制表符都算);括号()用来捕获这部分空白,替换时用\1调用捕获的内容,这样就把前面的foo去掉,只留下空白和bar。末尾的g是全局替换,确保一行里多个符合条件的foo都会被处理。
用awk实现
如果更习惯awk,可以用它的gensub函数(GNU awk支持),思路和sed完全一致:
awk '{print gensub(/foo([[:space:]]+)bar/, "\\1bar", "g")}' 你的文件名.txt
gensub是awk里支持捕获组的替换函数,第三个参数"g"同样是全局替换,\\1对应捕获的空白部分,最终输出处理后的每行内容。
验证效果
拿你的示例输入测试:
原内容:
foo bar foo bar bar foo foo bar foo
执行命令后会得到:
bar bar bar foo bar foo
完全符合你想要的结果~
备注:内容来源于stack exchange,提问作者vim_overlord
相关产品推荐
相关产品推荐

