如何使用sed替换退格字符(\b)?

3
我希望删除从stdin中某些退格字符(\b)的固定数量。到目前为止,我尝试了以下方法:
echo -e "1234\b\b\b56" | sed 's/\b{3}//'

但它不起作用。我该如何使用sed或其他unix shell工具实现这一目标?
6个回答

10

你可以使用回退符的十六进制值:

echo -e "1234\b\b\b56" | sed 's/\x08\{3\}//'

你还需要转义大括号。


或者您可以使用-r标志进行扩展模式:echo -e“1234 \ b \ b \ b \ b5678”| sed -r's / \ o010 {3} / a /' - codecraft
据我所知,这是GNU sed。 - dawg

5
您可以使用 tr
echo -e "1234\b\b\b56" | tr -d '\b'
123456

如果你想删除三个连续的退格键,可以使用Perl:

echo -e "1234\b\b\b56" | perl -pe 's/(\010){3}//'

我不想将所有的\b出现都替换为空格,只想替换一定数量的出现次数,这就是为什么我尝试使用重复模式'{3}'的原因。 - Thiago Padilha

4

sed将\b解释为单词边界。我在perl中这样使用它:

echo -e "1234\b\b\b56" | perl -pe '$b="\b";s/$b//g'

ASCII 值也可以:echo -e"1234\b\b\b56" | perl -pe's/ \\ 010 // g' - Eugene Yarmash
请看我在上一个问题中的评论。 - Thiago Padilha
以下命令可以实现此功能:echo -e "1234\b\b5" | perl -pe 's/\010{2}/t/g' - Thiago Padilha

2

使用sed:

echo "123\b\b\b5" | sed 's/[\b]{3}//g'

你需要在{3}中转义{},并且通过使用字符类处理特殊的\b

[birryree@lilun ~]$ echo "123\b\b\b5" | sed 's/[\b]\{3\}//g'
1235

1
你在这里作弊了。你替换了长度为3的\b序列,而不是三个退格字符的序列。 - Paŭlo Ebermann

2

请注意,如果您希望同时删除被删除的字符,请查看ansi2html.sh,其中包含如下处理:

printf "12..\b\b34\n" | sed ':s; s#[^\x08]\x08##g; t s'

1

这里不需要使用 Perl!

# version 1
echo -e "1234\b\b\b56" | sed $'s/\b\{3\}//' | od -c

# version 2
bvar="$(printf '%b' '\b')"
echo -e "1234\b\b\b56" | sed 's/'${bvar}'\{3\}//' | od -c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接