2016-10-21 4 views
2

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)

+1

kann nicht reproduzieren. Verwenden Sie MSYS Windows 10 & sed 4.2.2 & Ihre Testdaten. Ich bekomme das richtige Ergebnis von der Kommandozeile oder Shell. –

+0

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. –

Antwort

2

Das Problem war nur, dass ich sed-gsed Ändern eines längst vergessenen Bash alias hatte - der GNU-Version als installiert von Homebrew. Das erklärt, warum sed --version sich als gsed in der Befehlszeile gemeldet hat. Ich hatte which sed aus dem Skript und der Eingabeaufforderung überprüft, aber ich dachte nicht über type und Bash-Aliase.

$ type sed 
sed is aliased to `gsed' 
+0

Ich hatte das gleiche Problem und vergaß die Aliase! Vielen Dank! – Jondlm

Verwandte Themen