Warum ersetzt der sed-Befehl das Muster nicht in einem Shell-Skript?

Warum ersetzt der sed-Befehl das Muster nicht in einem Shell-Skript?

Ich versuche, ein Shell-Skript vorzubereiten, das mehrere verkettete Sed-Befehle enthält.

Ich verwende /bin/shFreeBSD 12. Das scheint POSIX-kompatibel zu sein (siehe ManpageHier).

Ich habe Folgendes versucht. Es ist deutlich zu erkennen, dass das Verhalten nicht dem erwarteten entspricht:

$ 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

$ 

Ich glaube, ich übersehe hier etwas Grundlegendes.

Antwort1

Du bistLektüreZeilen, aber Sie tun nichts mit dem, was Sie lesen. Versuchen Sie:

#!/bin/sh

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

Möglicherweise möchten Sie auch while read linedie

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

um sicherzustellen, dass Sie alles lesen, wie cat testfile.txt | sed 's/<TEST>/FOO/'Sie möchten. Siehe

Antwort2

Auf jeden Fall, während SiedürfenWenn Sie komplexe Skripte in der Shell schreiben, ist es besser, eine Sprache zu verwenden, die für Skripte und nicht für interaktive Nutzung entwickelt wurde. Python, Perl oder Raku sind meine ersten Ideen, wenn ich etwas Komplexeres als ein paar Zeilen mache. Python ist beliebt und fast überall verfügbar, ebenso Perl; Raku ist eine Weiterentwicklung/grundlegende Neugestaltung von Perl und bei weitem nicht so beliebt (noch nicht?).

verwandte Informationen