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

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

いくつかの連鎖した sed コマンドを含むシェル スクリプトを準備しようとしています。

私は/bin/shFreeBSD 12で使用しています。これは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 は人気があり、ほぼどこでも利用できます。Perl も同様です。Raku は Perl の進化版/根本からの再設計ですが、Perl ほど人気はありません (まだ?)。

関連情報