Bash:回显变量,空格重叠字符串

时间:2014-03-16 23:45:42

标签: bash

我正在寻找变量中的特定行,例如

echo "$CodeDesc"

0x19 ERASE(6)
0x1A MODE SENSE(6)
0x1B START STOP UNIT
0x1C RECEIVE DIAGNOSTIC RESULTS
0x1D SEND DIAGNOSTIC
0x1E PREVENT ALLOW MEDIUM REMOVAL
0x23 READ FORMAT CAPACITIES
0x24 SET WINDOW

e.g。如果我只是在寻找“MODE SENSE(6)”,我正在使用grep和awk(也尝试使用sed)

desc="$( grep "0x1A" <<< "$CodeDesc" | awk '{print substr($0, index($0,$2))}' )"

这确实给了我正确的字符串,即“MODE SENSE(6)”,但是当我回显时它重叠了一些字符串:

echo "DESC: \"$desc\""

给我:

  "SC:"MODE SENSE(6)

请注意\“已移至开头且缺少DE。

后来我也打印了同一个变量和另一个变量:

echo -e "${desc}${code}"

我希望打印出来:

MORE SENSE(6) 0x1A 1

但我得到了:

 0x1a 1NSE(6)

我无法弄清楚这是怎么回事,任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:4)

显然,您的$CodeDesc是由CRLF终止的行组成的字符串。 grepawk忠实地保留了行结尾,并且shell的$()替换剥离了最终的LF,留下了一个以CR结尾的字符串。

当打印CR时,光标移动到行的开头,接下来打印的任何内容都会覆盖那里的内容。

您可以通过向管道添加| tr -d '\015'来解决此问题,也可以在awk中完成所有操作,包括grep部分:

desc="$(awk '{gsub(/\r/,"")} /0x1A/ {print substr($0, index($0,$2))}' <<< "$CodeDesc")"

答案 1 :(得分:2)

这里不需要任何福克斯和油脂。

Bash版本&gt; V4:

declare -A codes

while read -r code desc; do
    codes["$code"]=$desc
done <<< "$CodeDesc"

printf 'DESC: "%s"' "${codes['0x1A']}"

Bash版本&lt; V4:

while read -r code desc; do
    [[ $code = '0x1A' ]] && printf 'DESC: "%s"' "$desc"
done <<< "$CodeDesc"