Ich werde das Formular mit cURL senden, wobei ein Teil des Inhalts aus einer anderen Datei stammt, die mit ausgewählt wurde sed
Wenn param1
ein Zeilenmuster aus einer anderen Datei verwendet sed
wird, funktioniert der folgende Befehl einwandfrei:
curl -d param1="$(sed -n '/matchpattern/p' file.txt)" -d param2=value2 http://example.com/submit
Gehen Sie jetzt zum Problem. Ich möchte nur Text zwischen 2 übereinstimmenden Mustern mit Ausnahme des übereinstimmenden Musters selbst anzeigen.
Sagen wir, file.txt
enthält:
Bla bla bla
firstmatch
It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
secondmatch
The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English.
Derzeit viele „beetween 2 Anpassungsmuster“ sed
wird Befehl nicht entfernen firstmatch
und secondmatch
.
Ich möchte das Ergebnis werden:
It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
text-processing
sed
lokomika
quelle
quelle
Antworten:
Hier ist eine Möglichkeit, wie Sie es tun können:
Erklärt: Löschen Sie von der ersten Zeile bis zur Zeile, die mit firstmatch übereinstimmt . Löschen Sie von der Zeile, die der zweiten Übereinstimmung entspricht, bis zur letzten Zeile.
quelle
In awk:
quelle
Die andere
sed
Lösung schlägt fehl, wennfirstmatch
in der 1. Zeile 1 ein Fehler auftritt .Halten Sie es einfach, verwenden Sie einen einzelnen Bereich und einen leeren 2 regulären
Ausdruck : Drucken Sie entweder alles in diesem Bereich mit Ausnahme der Bereichsenden (automatisches Drucken deaktiviert). 3 :
oder, kürzer, lösche alles, was nicht in diesem Bereich liegt und lösche auch die Bereichsenden:
1: Der Grund ist, dass, wenn die zweite Adresse ein regulärer Ausdruck ist, die Suche nach der Endübereinstimmung mit der Zeile beginnt, die auf die Zeile folgt, die mit der ersten Adresse übereinstimmt . Wird
daher
/firstmatch/
für die 1. Zeile der Eingabe nie ausgewertet,sed
wird sie einfach gelöscht, da sie mit der Zeilennummer in1,/RE/
der 2. Zeile übereinstimmt, und es wird geprüft, ob die Zeile übereinstimmt/firstpattern/
2: Wenn ein REGEX leer ist (dh
//
),sed
verhält es sich so, als ob das letzte im zuletzt angewendeten Befehl verwendete REGEX (entweder als Adresse oder als Teil eines Ersatzbefehls) angegeben wurde.3: Die
;}
Syntax gilt für modernesed
Implementierungen. Verwenden Sie bei älteren Ausdrücken entweder eine neue Zeile anstelle des Semikolons oder separate Ausdrücke, zsed -n -e '/firstmatch/,/secondmatch/{//!p' -e '}' infile
quelle
//
(innerhalb des{…}
) tut ?//
dies der letzte reguläre Ausdruck ist, der verwendet wurde. von allem, was ich gelesen habe, sollte das sein/secondmatch/
. Ich habe durch Testen überprüft, ob Ihr Befehl funktioniert, und bin zu dem Schluss gekommen, dass er wie folgt funktioniert/firstmatch|secondmatch/
(was Sie bestätigt haben), aber ich kann keine Dokumentation finden (nicht einmal das von Ihnen verknüpfte POSIX-Dokument oder die GNU sed manual ), das dieses Verhalten beschreibt. … (Fortsetzung)sed
: (1) Wenn ich das tue/first/,4
, dann//
verhält es sich so/first/
. (2) Wenn dies der Fall ist2,/second/
,//
wird der Fehler "Kein vorheriger regulärer Ausdruck" angezeigt. (Ich halte das für ein offensichtliches Versäumnis, dem angegebenen Verhalten zu folgen.) (3) Das Hinzufügen--posix
ändert nichts an den oben genannten Punkten . (II) In anderen Programmen: (4) Invi
, after/first/,/second/
,//
verhält sich wie/second/
(und die anderen Formen sind ebenfalls rationale Implementierungen der dokumentierten Regel). … (Fortsetzung)awk
scheint keine Ahnung von „der zuletzt verwendeten RE“ zu haben;//
bezieht sich auf das Nicht-Zeichen vor oder nach einem Zeichen. (Ich lade Sie ein, es zu versuchenecho -- | awk '{ gsub(//, "cha"); print }'
.)/first|second/
. Du Glückspilz. Ich erwähne die anderen Programme, um zu demonstrieren, dass dies keine systemweite Regex-Konvention ist. Wer es hinzufügte,sed
kümmerte sich nicht darum, es hinzuzufügenvim
, wo es genauso viel Sinn gemacht hätte. :-)