Sed
sed with here-string 失敗,但是當 echo 輸出通過管道傳輸到 sed 時成功
更新
sed
到4.4
版本後,sed
不會在find
給它的命令輸出中用逗號替換空格here-string
:sed --version sed (GNU sed) 4.4 ls -l /tmp/test/ total 0 -rw-r--r-- 1 root root 0 Jan 9 17:25 a -rw-r--r-- 1 root root 0 Jan 9 17:25 b # NOT EXPECTED sed "s: :,:g" <<< $(find /tmp/test/ -type f) /tmp/test/b /tmp/test/a
sed
4.2沒有問題sed --version sed (GNU sed) 4.2.2 ls -l /tmp/test/ total 0 -rw-r--r-- 1 root root 0 Jan 9 17:25 a -rw-r--r-- 1 root root 0 Jan 9 17:25 b # as expected sed "s: :,:g" <<< $(find /tmp/test/ -type f) /tmp/test/a,/tmp/test/b
作為一種解決方法,將結果儲存在變數中並使用
echo
有助於:a=$(find /tmp/test/ -type f) echo $a | sed "s: :,:g" /tmp/test/b,/tmp/test/a
如何
sed
使用 4.4實現相同的輸出here-string
?更新
兩個系統之間的 bash 版本也發生了變化:
bash --version GNU bash, version 4.4.20
舊版
bash --version GNU bash, version 4.3.48
這是4.3 和 4.4 版本之間的變化
bash
正如文件一直所說的那樣,Bash 不再拆分 here-strings 的擴展。
正確的行為是您的新版本,因為您依賴舊程式碼的錯誤。
這將為您提供以逗號分隔的文件列表,
find -type f | tr '\n' , | sed 's/,$/\n/'
但是,由於文件名本身可以包含換行符和逗號,因此很容易破壞這種脆弱的程式碼。如果您願意分享您的處理過程 - 在一個新問題中 - 我相信有人會推荐一種更好的方法來可靠和安全地處理文件名。