Я пытаюсь подготовить скрипт оболочки, включающий несколько связанных команд sed.
Я использую /bin/sh
FreeBSD 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, не такая популярная (пока?).