Bash
sed bash 腳本意外地用空格而不是換行符替換字元
使用 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
命令 astr '*' '\n'
,或在 shell 中使用快速變數替換:printf '%s\n' "${IN_TXT//\*/ }"
或者,
OUT_TXT=${IN_TXT//\*/ } printf '%s\n' "$OUT_TXT"