用 sed 替换 '\t'

Replacing '\t' with sed

虽然许多帖子都解决了 sed 中制表符的替换问题,但 none 对我有用,就像在这个 C 语句中一样替换 '\t':

char c = '\t'; // to become char c = MMM;

我尝试了以下食谱并且none成功了:

"s/'\t'/MMM/g"
"s/'\t'/MMM/g"
"s/' '/MMM/g" // I pressed the <TAB> key

感谢任何帮助。

如果您从 shell 调用 sed,您可能会成为 shells 字符串处理的受害者。也就是说,应该传递给 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;

这是不同之处 - 假设您要将 \t 替换为 costs :

而不是 MMM
$ sed 's/'\''\t'\''/costs /' <<<"char c = '\t';"
char c = costs ;

$ sed "s/'[\]t'/costs /" <<<"char c = '\t';"
char c = costs 5;

双引号脚本失败,因为您将其暴露给 shell 进行解释,并且根据您的 shell,它将 </code> 读作 <code> (传递给 shell 的第 2 个位置参数的值)然后 5.