Bash

sed bash 腳本意外地用空格而不是換行符替換字元

  • April 28, 2020

使用 bash 命令語法:

echo "The*quick*brown*fox"|sed s/*/\\n/g

我得到了想要的輸出:

The
quick
brown
fox

但是在腳本中:

IN_TXT="The*quick*brown*fox"
OUT_TXT=$(echo $IN_TXT|sed s/*/\\n/g)
echo $OUT_TXT

我得到空白: The quick brown fox

我究竟做錯了什麼?

當您OUT_TXT將它與echo. 這會導致 shell 將空格、製表符和換行符上的變數值拆分為單詞,然後作為參數給出echo(在另外進行文件名通配擴展之後)。 echo然後輸出這些參數,它們之間有空格。

總是引用你的變數擴展:

echo "$OUT_TXT"

另請注意,您在echo $IN_TXT. 如果變數的擴展IN_TXT未引用為"$IN_TXT",則其值將用作通配模式,並將替換為任何匹配的文件名(IN_TXT='*'例如,使用 測試)。

您的表達中存在類似的問題sed,因為它沒有被正確引用。

也可以看看:

此外,您的sed命令寫得更好,sed 'y/*/\n/'因為標準sed不能在命令插入換行符s///(GNUsed是一個例外)。該sed命令y/// 確實知道如何將單個字元更改為換行符,無論使用什麼實現sed

或者,您可以簡單地使用tr命令 as tr '*' '\n',或在 shell 中使用快速變數替換:

printf '%s\n' "${IN_TXT//\*/ }"

或者,

OUT_TXT=${IN_TXT//\*/ }
printf '%s\n' "$OUT_TXT"

引用自:https://unix.stackexchange.com/questions/583047