我正在运行一个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变量中,因此我更喜欢不输入文件的解决方案。
答案 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 error
比printf
具有更高的可移植性。您需要使用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
$