Почему команда sed не заменяет шаблон внутри скрипта оболочки?

Почему команда sed не заменяет шаблон внутри скрипта оболочки?

Я пытаюсь подготовить скрипт оболочки, включающий несколько связанных команд sed.

Я использую /bin/shFreeBSD 12. Кажется, он совместим с POSIX (см. страницу руководстваздесь).

Вот что я попробовал, и ясно видно, что поведение не соответствует ожидаемому:

$ 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, не такая популярная (пока?).

Связанный контент