【问题标题】:How do I replace backspace characters (\b) using sed?如何使用 sed 替换退格字符 (\b)?
【发布时间】:2011-03-03 14:11:25
【问题描述】:

我想从标准输入中删除固定数量的一些退格字符( \b )。到目前为止,我已经尝试过:

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

但它不起作用。如何使用 sed 或其他一些 unix shell 工具来实现这一点?

【问题讨论】:

    标签: linux bash shell sed


    【解决方案1】:

    退格可以使用十六进制值:

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

    你还需要转义大括号。

    【讨论】:

    • 或者您可以使用 -r flah 进行扩展模式:echo -e "1234\b\b\b\b5678" | sed -r 's/\o010{3}/a/'
    • 据我所知,这只是 GNU sed。
    【解决方案2】:

    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'
    • 查看我对上述问题的评论
    • 以下工作:echo -e "1234\b\b5" | perl -pe 's/\010{2}/t/g'
    【解决方案3】:

    你可以使用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}'
    【解决方案4】:

    使用 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
    

    【讨论】:

    • 你在这里作弊。您正在替换长度为 3 的 ` and b` 序列,而不是 3 个退格字符的序列。
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      这里不需要 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
      

      【讨论】:

        猜你喜欢
        • 2019-06-07
        • 2021-05-26
        • 1970-01-01
        • 1970-01-01
        • 2018-04-29
        • 2021-03-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        相关资源
        最近更新 更多