我的输入来自包含特殊转义字符的管道。为了便于说明,该流如下所示:
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/\.bar
Ctrl-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/\..*//'