Por que o comando sed não está substituindo o padrão dentro de um script de shell?

Por que o comando sed não está substituindo o padrão dentro de um script de shell?

Estou tentando preparar um script de shell para incluir vários comandos sed encadeados.

Estou usando /bin/shno FreeBSD 12. Que parece ser compatível com POSIX (consulte a página de manualaqui).

Foi o que tentei, percebe-se claramente que o comportamento não é o esperado:

$ 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

$ 

Acho que estou faltando algo básico aqui.

Responder1

Você éleituralinhas, mas você não está fazendo nada com o que lê. Tentar:

#!/bin/sh

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

Além disso, você pode querer alterar o while read linepara

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

para garantir que você está lendo tudo como cat testfile.txt | sed 's/<TEST>/FOO/'faria. Ver

Responder2

De qualquer forma, enquanto vocêpodeescrever scripts complexos em shell, é melhor usar uma linguagem projetada para scripts, não para uso interativo. Python, Perl ou Raku são minhas primeiras ideias ao fazer algo mais complexo do que algumas linhas. Python é popular e está disponível em quase todos os lugares, assim como Perl; Raku é uma evolução/redesenho do Perl, não tão popular (ainda?).

informação relacionada