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

Bri*_*ian 3 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
Run Code Online (Sandbox Code Playgroud)

例如,如果我只是在寻找“MODE SENSE(6)”,我将使用 grep 和 awk(也尝试使用 sed)

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

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

echo "DESC: \"$desc\""
Run Code Online (Sandbox Code Playgroud)

给我:

  "SC:"MODE SENSE(6)
Run Code Online (Sandbox Code Playgroud)

请注意,\" 已移至开头并且缺少 DE。

稍后我还将打印同一个变量和另一个变量:

echo -e "${desc}${code}"
Run Code Online (Sandbox Code Playgroud)

我希望这个打印:

MORE SENSE(6) 0x1A 1
Run Code Online (Sandbox Code Playgroud)

但相反,我得到:

 0x1a 1NSE(6)
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚这是怎么回事,任何帮助将不胜感激。

小智 5

显然你$CodeDesc是一个由 CRLF 终止的行组成的字符串。grepawk忠实地保留行尾,shell 的$()替换删除了最后的 LF,只留下一个以 CR 结尾的字符串。

打印 CR 时,光标移动到行首,接下来打印的内容会覆盖那里的内容。

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

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