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