虽然很多帖子都说明了替换sed中的标签,但是没有任何帖子可以替代' \ t'就像在这个C语句中一样:
char c = '\t'; // to become char c = MMM;
我尝试了以下食谱,但都没有效果:
"s/'\t'/MMM/g"
"s/'\\t'/MMM/g"
"s/' '/MMM/g" // I pressed the <TAB> key
感谢任何帮助。
答案 0 :(得分:1)
如果从shell调用sed,则可能会成为shell字符串处理的受害者。也就是说,应该传递给sed
的字符串应该是"s/'\\t'/MMM"
(其中双引号"
不是字符串的一部分)。
大多数shell从传递的参数中删除一级反斜杠("\\"
传递为"\"
)。因此你需要加倍它们。
对于单引号字符串,情况并非如此('\\t'
作为'\\t'
传递)。由于您的模式包含单引号,因此在这种情况下您必须将其重写为's/'\''\\t'\''/MMM/'
。
$ sed "s/'\\\\t'/MMM/" <<<"char c = '\t';"
char c = MMM;
但是你不会真的写4个转义符,你只需要使用括号表达式:
$ sed "s/'[\]t'/MMM/" <<<"char c = '\t';"
char c = MMM;
或避免将其余脚本暴露给shell:
$ sed 's/'\''\\t'\''/MMM/' <<<"char c = '\t';"
char c = MMM;
以下是区别 - 让我们说MMM
而不是\t
替换为costs $25
:
$ sed 's/'\''\\t'\''/costs $25/' <<<"char c = '\t';"
char c = costs $25;
$ sed "s/'[\]t'/costs $25/" <<<"char c = '\t';"
char c = costs 5;
双引号脚本失败,因为你将它暴露给shell进行解释,并且根据你的shell,它将$25
读作$2
(传递给第二个位置参数的值) shell)然后5
。