¿Por qué el comando sed no reemplaza el patrón dentro de un script de shell?

¿Por qué el comando sed no reemplaza el patrón dentro de un script de shell?

Estoy intentando preparar un script de shell para incluir varios comandos sed encadenados.

Estoy usando /bin/shFreeBSD 12. Que parece ser compatible con POSIX (consulte la página de manualaquí).

Esto es lo que he probado, se ve claramente que el comportamiento no es el 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

$ 

Supongo que me falta algo básico aquí.

Respuesta1

Estáslecturalíneas, pero no estás haciendo nada con lo que lees. Intentar:

#!/bin/sh

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

También es posible que desee cambiar while read lineel

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

para asegurarse de que está leyendo todo como cat testfile.txt | sed 's/<TEST>/FOO/'lo haría. Ver

Respuesta2

En cualquier caso, mientras ustedpoderAl escribir scripts complejos en Shell, es mejor utilizar un lenguaje diseñado para scripting, no para uso interactivo. Python, Perl o Raku son mis primeras ideas a la hora de hacer algo más complejo que unas pocas líneas. Python es popular y está disponible en casi todas partes, lo mismo que Perl; Raku es una evolución/rediseño desde cero de Perl, no tan popular (¿todavía?).

información relacionada