Auf der Seite des POSIX- Standards finden Sie untersed
:
Das Skript muss aus Bearbeitungsbefehlen der folgenden Form bestehen:
[ Adresse [, Adresse ]] Funktion
Dabei function
steht ein einstelliges Befehlsverb aus der Liste unter
Bearbeiten von Befehlen in sed , gefolgt von allen zutreffenden Argumenten.
Das erste nicht leere Zeichen nach der Adresse wird also als Befehlsverb verwendet - in Ihrem speziellen Fall ist es /
daher der Fehler : char 9: unknown command: '/'
.
Auf die Klammern wird weiter unten verwiesen:
[ 2addr ] { Bearbeitungsbefehl
Bearbeitungsbefehl
...
}}
Führen Sie eine Liste von "sed" -Bearbeitungsbefehlen nur aus, wenn der Musterbereich ausgewählt ist. …
[ 2addr ] ist ein Indikator dafür, dass die maximal zulässige Anzahl von Adressen zwei beträgt.
Um einen oben genannten Punkt zu verdeutlichen, heißt es im Abschnitt Adressen von sed(1)
:
Sed
Befehle können ohne Adressen gegeben werden. In diesem Fall wird der Befehl für alle Eingabezeilen ausgeführt. mit einer Adresse. In diesem Fall wird der Befehl nur für Eingabezeilen ausgeführt, die dieser Adresse entsprechen. oder mit zwei Adressen. In diesem Fall wird der Befehl für alle Eingabezeilen ausgeführt, die dem inklusiven Zeilenbereich von der ersten Adresse bis zur zweiten Adresse entsprechen. Drei Dinge, die bei Adressbereichen zu beachten sind: Die Syntax lautet addr1 , addr2 (dh die Adressen werden durch ein Komma getrennt);
… (Und andere Dinge, die für diese Diskussion nicht relevant sind) …
Die gnu info page ( info sed
) enthält eine ähnliche Beschreibung von {
und }
unter "3.4 Häufig verwendete Befehle":
{ BEFEHLE }
Eine Gruppe von Befehlen kann zwischen {
und }
Zeichen eingeschlossen sein. Dies ist besonders nützlich, wenn eine Gruppe von Befehlen durch eine einzelne Adressübereinstimmung (oder einen Adressbereich) ausgelöst werden soll.
Andernfalls werden geschweifte Klammern verwendet, um mehrere Befehle an derselben Adresse anzuwenden oder Adressen zu verschachteln.
Der Standard ist hier nicht sehr explizit 1, aber die linke Klammer {
ist tatsächlich ein Befehl, der eine Gruppe anderer sed-Befehle startet (die Gruppe endet mit einer rechten Klammer }
).
Und auf die Gefahr wirklich gehen TL; DR , ist das Problem , dass 195
, 210
und /add/
sind alle Adressen . sed
Mit drei Adressen können keine Befehle aufgerufen werden. Der Befehl funktioniert also, indem Sie den {
Befehl im Adressbereich aufrufen 195,210
und dann (innerhalb dieses Bereichs) den p
Befehl in der Adresse aufrufen /add/
.
1:
obwohl , wenn Sie die ganze Seite gelesen wird erwähnt , dass:
Befehl Verben andere als { , a , b , c , i , r , t , w , : und # durch folgen ...
sed -n '195,210s/old/new/p' <file>
. B. funktioniert dies einwandfrei. Links zum POSIX-Standard sind ebenfalls nützlich.195,210s/old/new/p
tatsächlich ein Bereich ist, dem ein einzelner Befehl folgt :s
; In diesem Fallp
handelt es sich nicht um einen Befehl, sondern um ein Flag (dies bedeutet Drucken, wenn ein Ersatz vorgenommen wurde). Dies
Syntax finden Sie im Handbuch :s/regexp/replacement/flags
. Deshalb funktioniert es ohne Klammern ...sed -n '195,210{/add/p}' <file>
gibt es zwei Befehle, 1. die/add/
Regex und 2. derp
, Druckbefehl und dass deshalb die{...}
Klammer Block benötigt wird?/add
, sondern der{
, mit dem du eine Adresse in eine andere verschachteln kannst. Antwort bearbeitet.vi
(oderex
), und sie sehen ganz ähnlich wiesed
Adressen.Gemäß der Dokumentation für
sed
die geschweiften Klammern werden Befehle gruppiert. DamitWird zuerst
195,210
mit einem Blockbefehl als Adressbereich behandelt . Der Blockbefehl besteht dann aus der Adressangabe/add/
mit dem Befehl printp
quelle
Die sed-Syntax lautet wie folgt
Adresse / Befehl.
195.210 ist also die erste Adresse, mit der Sie übereinstimmen, aber dann möchten Sie einen neuen Befehl innerhalb dieses Bereichs ausführen, nämlich "hinzufügen" und dann drucken. Daher müssen Sie diesen zusätzlichen Befehl mit den geschweiften Klammern gruppieren.
quelle