【问题标题】:Replace HEX characters (\x20) from string with ASCII space用 ASCII 空格替换字符串中的 HEX 字符 (\x20)
【发布时间】:2019-05-15 23:12:41
【问题描述】:

我正在运行一个 shell 命令,它返回由 ASCII 和十六进制字符组合而成的原始字符串。它嵌入的字符是十六进制的空格字符。下面是输出:

KINGSTON\x20SV100S2
ST380011A\x20\x20\x20\x20\x20\x20\x20
Maxtor\x206L300S0\x20\x20

如何将所有 \x20 替换为单个 ASCII 空格字符?

预期输出:

KINGSTON SV100S2
ST380011A
Maxtor 6L300S0

P.S 字符串存储在 bash 变量中,因此我更喜欢不输入文件的解决方案。

【问题讨论】:

    标签: linux bash replace hex ascii


    【解决方案1】:

    只替换\x20,不使用其他任何东西使用sed

    sed 's/\\x20/ /g' <<< "$output"
    

    yourCommand | sed 's/\\x20/ /g'
    

    要替换所有转义序列,请使用 echo -n(正如 kvantour 已经指出的那样)或者更好,更便携的 printf %b 也可以直接分配给变量而不使用 $()

    printf -v output %b "$output"
    

    【讨论】:

    • +1 for printf -v 非常高效,如果需要还可以更改其他反斜杠序列,否则也可以在扩展中完成"${output//'\x20'/ }"
    【解决方案2】:

    你也可以试试 Perl

    $ perl -e ' BEGIN { print "KINGSTON\x20SV100S2","\n" } '
    KINGSTON SV100S2
    $
    

    您可以将其导出到环境中

    $ export a="KINGSTON\x20SV100S2"
    $ perl -e ' BEGIN { $x=$ENV{a}; $x=~s/\\x(\d{2})/chr(hex($1))/ge; print $x,"\n" } '
    KINGSTON SV100S2
    $
    

    【讨论】:

      【解决方案3】:

      一种快速的方法是使用echo -e

      $ echo -e "KINGSTON\x20SV100S2"
      KINGSTON SV100S2
      

      -e启用反斜杠转义解释

      或者直接使用printf

      $ printf "KINGSTON\x20SV100S2"
      KINGSTON SV100S2
      

      【讨论】:

      • 谢谢,用 echo 重新分配变量有助于解决这个问题。 HD_NAME=$(echo -e "$HD_NAME")
      【解决方案4】:

      printfecho -e 更便携。您需要使用%b 格式。 根据help printf

      %b在相应参数中展开反斜杠转义序列

      定义一个效用函数:

      expbs() { printf '%b\n' "$@"; }
      

      然后将其用作:

      expbs 'KINGSTON\x20SV100S2'
      KINGSTON SV100S2
      
      expbs 'ST380011A\x20\x20\x20\x20\x20\x20\x20'
      ST380011A
      
      expbs 'Maxtor\x206L300S0\x20\x20'
      Maxtor 6L300S0
      

      【讨论】:

        猜你喜欢
        • 2013-04-01
        • 2013-05-09
        • 2012-01-20
        • 2013-01-29
        • 1970-01-01
        • 2020-12-19
        • 1970-01-01
        • 1970-01-01
        • 2015-03-11
        相关资源
        最近更新 更多