替换' \ t'与sed

时间:2018-01-31 15:33:57

标签: sed escaping special-characters

虽然很多帖子都说明了替换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

感谢任何帮助。

1 个答案:

答案 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