用ASCII空格替换字符串中的十六进制字符(\ x20)

时间:2018-12-14 16:49:22

标签: linux bash replace hex ascii

我正在运行一个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变量中,因此我更喜欢不输入文件的解决方案。

4 个答案:

答案 0 :(得分:4)

要仅替换\x20,不要使用sed

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

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

要替换所有转义序列,请使用echo -n(如kvantour所指出的那样),或者甚至更好的方法是使用更具移植性的printf %b,它也可以不使用$()而直接分配给变量:

printf -v output %b "$output"

答案 1 :(得分:1)

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

$ echo -e "KINGSTON\x20SV100S2"
KINGSTON SV100S2
  

-e 启用反斜杠转义的解释

或者只使用printf

$ printf "KINGSTON\x20SV100S2"
KINGSTON SV100S2

答案 2 :(得分:1)

Payment errorprintf具有更高的可移植性。您需要使用echo -e格式。  按照%b

  

help printf在相应的参数中扩展反斜杠转义序列

定义实用功能:

%b

然后将其用作:

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

答案 3 :(得分:1)

您也可以尝试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
$