使用 sed 删除转义字符

使用 sed 删除转义字符

我的输入来自包含特殊转义字符的管道。为了便于说明,该流如下所示:

printf "foo.bar\033[00m" > file
cat file

如何删除尾随.bar\033[00m?我已尝试以下方法,但这不起作用:

cat file | sed 's/\.bar\033[00m//'

答案1

如果您的文件包含控制字符,例如

printf "foo.bar\033[00m" > file

然后删除特定的、单个出现的.bar\033[00m写入以下内容:

sed $'s/\.bar\033\[00m//'

要删除整个文件中的所有转义序列:

sed $'s/\033\[[0-9;]*m//g'

单引号字符串前的美元 ( $'some text') 指示 shell 将 ANSI C 引用应用于字符串的内容,就像printf这样做一样。这是生成“转义”ASCII 字符 ( 0x1B/ 033/...) 所必需的。

该角色也可以通过键盘快捷键生成(没有$'必要):

sed 's/\.barCtrl-vESC\[00m//'

击中后,Ctrl-vESC您应该^[在屏幕上看到,但不是文字^[(两个字符),而是一个控制字符。


原答案

如果你想在输出foo

printf '%s' 'foo.bar\033[00m' | sed 's/\.bar\\033\[00m//'

请注意,两个\和 都[必须被另一个 转义\。此外,我还添加了'%s'toprintf将输入字符打印为文字字符串,否则\033[可能会被解释为转义代码,后跟 ANSI 颜色。

答案2

您需要使用反斜杠转义[和字符:\

printf '%s' "foo.bar\033[00m" | sed 's/\.bar\\033\[00m//'

或者,如果您想删除字符串中点字符之后的所有内容:

printf "foo.bar\033[00m" | sed 's/\..*//'

相关内容