Sed

sed with here-string 失敗,但是當 echo 輸出通過管道傳輸到 sed 時成功

  • January 9, 2022

更新sed4.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

sed4.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/'

但是,由於文件名本身可以包含換行符和逗號,因此很容易破壞這種脆弱的程式碼。如果您願意分享您的處理過程 - 在一個新問題中 - 我相信有人會推荐一種更好的方法來可靠和安全地處理文件名。

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