如何用sed替换C语句中的' '?多种尝试无效,求解决方案
解决sed替换C语句中单引号包裹制表符的问题
我太懂你这种踩坑的感觉了——明明看了一堆教程,结果替换带单引号和制表符的C代码就是不行,尤其是char c = ' ';要改成char c = MMM;这种场景,确实容易栽在shell转义和sed解析的双重坑上。
先给你拆解下之前几种写法无效的原因:
s/'\t'/MMM/g:shell会把\t直接解析成字母t,sed实际收到的是s/'t'/MMM/g,当然匹配不到制表符;s/'\\t'/MMM/g:shell解析后sed拿到的是s/'\t'/MMM/g,但POSIX标准的sed并不支持用\t表示制表符,只有GNU sed等扩展版本才认,所以兼容性差;- 直接按Tab的
s/' '/MMM/g:如果是用双引号包裹sed命令,shell可能会把制表符当成空格处理;就算用单引号,要是输入时不小心带了空格或者终端设置问题,也可能匹配失败。
下面给你几个靠谱的解决方案,按通用性排序:
方法1:用字面制表符+正确转义单引号(最通用)
这是不依赖sed版本的稳招,核心是用单引号包裹整个sed命令,同时正确转义单引号,中间直接输入字面制表符(按Tab键):
sed 's/'\'' '\''/MMM/g' your_file.c
解释下'\''的逻辑:先关闭单引号,输出一个单引号,再重新打开单引号,这样就能在单引号包裹的sed脚本里插入单引号了,中间的 是实打实的制表符。
方法2:用GNU sed的\t转义(适合GNU环境)
如果你的环境是GNU sed(比如Linux系统默认的sed),可以直接用\t,但要注意shell的转义,用双引号包裹命令:
sed "s/'\t'/MMM/g" your_file.c
或者用单引号时多一层反斜杠:
sed 's/'\''\\t'\''/MMM/g' your_file.c
但这个方法在BSD sed(比如macOS默认的sed)上会失效,因为POSIX sed不支持\t。
方法3:用ANSI-C quoting或printf生成制表符(适合不想手动输Tab的情况)
如果不想手动按Tab(怕输错),可以用bash支持的$'\t'或者printf来生成制表符:
# 用ANSI-C quoting sed "s/'$'\t''/MMM/g" your_file.c # 用printf sed "s/'$(printf '\t')'/MMM/g" your_file.c
这种写法更直观,也避免了手动输入制表符可能带来的错误。
你可以根据自己的环境选一个试试,大概率第一种通用方法就能解决你的问题~
内容的提问来源于stack exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

