ここで文字列を使用したsedは失敗しますが、エコー出力がsedにパイプされると成功します。

ここで文字列を使用したsedは失敗しますが、エコー出力がsedにパイプされると成功します。

バージョンsedに更新した後、次のようにコマンド出力でスペースがコンマに変わりません。4.4sedfindhere-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

sed4.4を使用して同じ出力を得るにはどうすればよいですかhere-string

修正する

bashのバージョンも2つのシステム間で変更されました。

bash --version
GNU bash, version 4.4.20

旧バージョン

bash --version
GNU bash, version 4.3.48

ベストアンサー1

これは変化bashバージョン4.3と4.4の間

ドキュメントで続けて言うように、Bashはもはやここで文字列拡張を分割しません。

以前のコードのバグに依存していたので、正しい動作は新しいバージョンです。

これにより、カンマ区切りのファイルのリストが表示されます。

find -type f | tr '\n' , | sed 's/,$/\n/'

ただし、ファイル名自体に改行文字とコンマを含めることができるため、脆弱なコードが壊れやすい。新しい質問でプロセスを共有したい場合は、誰かがファイル名を確実かつ安全に処理するためのより良い方法をお勧めできます。

おすすめ記事