Warum verhält sich sed je nachdem, ob es von der Befehlszeile oder einem Shell-Skript ausgeführt wird? Hier ist ein einfaches Beispiel:Warum verhält sich sed in einem Shell-Skript anders?
$ cat test.txt
foo
bar
baz
$ sed -e 's/^b\(\w*\)$/q\1/g' test.txt # works as intended
foo
qar
qaz
$ cat test.sh # The exact same command
sed -e 's/^b\(\w*\)$/q\1/g' test.txt
$ bash test.sh
foo
bar
baz
Jetzt, da ich in diesen aussehen weiter, ist \w
kein Standard BRE oder ERE (auch mit der -E
Flag) Zeichenklasse in POSIX regulären Ausdrücke. Es sind diese Art von Perl-ähnlichen GNU-Erweiterungen für REs, die nicht funktionieren, wenn ich den Befehl von einem Shell-Skript aus starte. In der Tat, wenn ich \w
zum POSIX [[:alnum:]]
ändere, funktioniert es, wie ich vorhabe. Keine GNU-Erweiterungen scheinen aus dem Shell-Skript zu funktionieren (einschließlich Groß-/Kleinschreibung \U
und \L
). Also versucht sed
zu erkennen, ob es von einem Shell-Skript ausgeführt wird und geben Sie eine Art von strikten POSIX-only-Modus ein? Gibt es Dokumentation darüber? Kann ich dieses Verhalten deaktivieren?
(Dies ist gsed (GNU sed) 4.2.2
)
kann nicht reproduzieren. Verwenden Sie MSYS Windows 10 & sed 4.2.2 & Ihre Testdaten. Ich bekomme das richtige Ergebnis von der Kommandozeile oder Shell. –
Ooooh, ich habe die Diskrepanz gefunden. Vor langer Zeit hatte ich in meinem '~/.bash_profile'' sed' in 'gsed' umbenannt. Ich hatte zuvor verifiziert "what sed", aber ich habe "type sed" nicht überprüft. –