sedコマンドがシェルスクリプト内のパターンを置き換えないのはなぜですか?

sedコマンドがシェルスクリプト内のパターンを置き換えないのはなぜですか?

複数の接続されたsedコマンドを含むシェルスクリプトを準備しようとしています。

私はFreeBSD 12を使用しています/bin/sh。これはPOSIXと互換性があるようです(manページを参照)。ここ)。

私が試したことは次のとおりです。その動作が予想されないことは明らかです。

$ cat testfile.txt 
<TEST>

$ cat test.sh 
#!/bin/sh

while read line
do
        sed 's/<TEST>/FOO/' 
done <&0
$ cat testfile.txt | ./test.sh 

$ cat testfile.txt | sed 's/<TEST>/FOO/'
FOO

$ 

私はここで基本的なものを見逃していると思います。

答え1

誰ですか読むわかりましたが、あなたが読んだ内容では何もできません。努力する:

#!/bin/sh

while read line
do
        printf '%s\n' "$line" | sed 's/<TEST>/FOO/'
done <&0

while read line以下に変更することもできます。

while IFS= read -r line || [ -n "$line" ]

すべての内容を意図したとおりに読んでいることを確認してくださいcat testfile.txt | sed 's/<TEST>/FOO/'。バラより

答え2

とにかく、あなたができるシェルで複雑なスクリプトを作成する場合は、対話型ではなくスクリプト用に設計された言語を使用することをお勧めします。数行のコードよりも複雑なタスクを実行すると、Python、Perl、またはRakuが最初に浮上します。 Pythonはほぼどこでも人気があり、使用できます。 RakuもPerlの進化/完全な再設計であり、あまり人気がありません(まだ?)。

関連情報