In dieser Bearbeitung
POSIXifiziert Stéphane Chazelas (erneut) meine Formatierung, indem er eine xpression break- Anweisung und eine andere xpression-Anweisung einfügt. Nun, ich könnte ihn vielleicht fragen, warum in den Kommentaren, nehme ich an, aber es ist bereits die Revision Nummer 18 zu dieser Antwort und fast alle vorherigen waren bereits ähnlichen Werbegeschenken zu verdanken (wenn Sie gelöschte Kommentare sehen können, wissen Sie was Ich meine) . Ich denke auch, dass ich nahe genug dran bin, um zu verstehen, warum man dies in einer Weise formuliert, die allgemeiner nützlich sein könnte. Also hier ist die Hoffnung ... sed
-e
-e
Im Allgemeinen ziehe ich es vor, meinen sed
-e
Gesamtdruck auf einen zu beschränken, aber ich habe auch eine größere Vorliebe dafür, mich so nah wie möglich an die Spezifikation zu halten , insbesondere wenn der Unterschied nicht mehr als a <space>
und an beträgt -e
. Aber ich kann das nicht tun, wenn ich nicht verstehe, warum ich sollte. Hier ist ein kurzer Überblick über den aktuellen Stand meines Verständnisses:
Die
' -e '
Unterbrechung kann portabel für einesed
Skript-\n
Esed
-Line- Unterbrechung in einer Befehlszeilenanweisung stehen ... Ich bin zugegebenermaßen unklar, warumDer schließenden Klammer in einer
sed
{
Funktion}
muss ein\n
ewline-Umbruch vorausgehen, wie hier angegeben:- Dem
<right-brace>
muss ein vorangestellt sein<newline>
und es können<blank>
Zeichen vorangestellt oder gefolgt werden .
- Dem
eine
\n
ewline Pause wird nach jeder Verwendung auf ähnliche Weise erforderlich ...a
,b
,c
,i
,r
,t
,w
, oder:
.
Aber ich verstehe nicht klar, wie sich die {
Funktionsdefinition }
auf den !
Nicht-Operator bezieht . Die einzige Erwähnung, die ich vom Negationsoperator in der Spezifikation finde, ist:
- Einer Funktion können ein oder mehrere
!
Zeichen vorangestellt werden. In diesem Fall wird die Funktion angewendet, wenn die Adressen den Musterraum nicht auswählen.
Bedeutet dies, dass die Verwendung eines Klammern !
impliziert ? Was ist mit Befehlen - sollten sie ebenfalls durch Pausen getrennt sein ? Wurde dies angesprochen, als Stéphane zuletzt meine Antwort POSIXifizierte ?{
}
$!
' -e '
Ich denke, es ist entweder der !
Negationsoperator oder es ist die b
Ranch-Anweisung, die er in seiner Bearbeitung anspricht - oder möglicherweise beides gleichzeitig -, aber ich weiß es nicht und möchte es. Wenn es nur die b
Ranch Aussage, dann glaube ich , ein d
an seiner Stelle tun würde , und die Notwendigkeit der Beseitigung ' -e '
Pause, aber ich würde lieber sicher sein , bevor sie eine dreimal hazarding POSIXified Antwort. Kannst du helfen?
Ich habe es riskieren , schließlich , aber nicht mit großer Sicherheit ...
:
Teil - du bist das vor Monaten nach Hause gefahren. Aber ich verstehe nicht ganz, warum der zweite sed
Befehl ähnlich POSIXified war .
sed
ist mir die POSIX-Spezifikation für sehr unklar. Ich habe in der Vergangenheit einige Male um Klarstellungen gebeten, aber ich glaube nicht, dass es als Ergebnis aktualisiert wurde. Ein guter Test ist der Versuch mit der Erbstück-Werkzeugkiste (Solaris, eine vom Original abgeleitete, auf der die POSIX-Spezifikation weitgehend basiert).
s///
werden Sie feststellen, dass Substitutionen die Verkettung mit einem akzeptieren ; . Kommandos, die mit einem Zeilenumbruch abgegrenzt werden müssen, werden verschwommen und wie -e
kann man in diesem Fall stehen - zumindest für mich. Ich bin noch nicht auf eine sed
gestoßen, die sie allerdings nicht wirklich austauschbar interpretiert.
;
bevor eine neue Zeile - eine neue Zeile ist in Ordnung. Ehrlich gesagt, Sie könnten-e
ganz auf das und alles verzichten und einfach eine Datei wie #!/bin/sed
mit jedem Befehl in eine neue Zeile schreiben - oder solche, die keine solchen Trennzeichen benötigen, stattdessen mit ;
. Diejenigen , die tun newlines erfordern , sind in der Regel diejenigen , die beliebige Eingaben nehmen - :
Markennamen und Befehle , die sich auf sie beziehen , wie b
oder t
oder Schließen }
curlies für Funktionen oder r
ead und w
Ritus , die Dateinamen args nehmen. Sie alle müssen tragbar gefolgt werden \n
.
b;n;:b
verzweigen Sie zu dem Label, das";n;:b"
in historischen und POSIX-Seds genannt wird (und GNU sed ist diesbezüglich nicht der Fall).