Ich habe diese Datei:
sometext1{
string1
}
sometext2{
string2
string3
}
sometext3{
string4
string5
string6
}
Ich möchte diese Datei nach einer bestimmten Zeichenfolge durchsuchen und alles vor dieser Zeichenfolge bis zur Eröffnung {
und alles nach dieser Zeichenfolge bis zum Abschluss drucken }
. Ich habe versucht, dies mit sed zu erreichen, aber wenn ich versuche, alles im Bereich zu drucken, /{/,/string2/
zum Beispiel sed, druckt dies:
sometext1{
string1
}
sometext2{
string2
sometext3{
string4
string5
string6
}
Wenn ich nach der Zeichenfolge "string2" suche, muss die Ausgabe wie folgt lauten:
sometext2{
string2
string3
}
Vielen Dank.
text-processing
sed
Rodrigo
quelle
quelle
grep -n '' <infile | sed ...
. Diesed
Befehle müssen geändert werden. speziell die/
Adressbits/
, die nach^
Top-of-Line-Ankern suchen . Wenn Sie also meine Antwort verwenden würden, könnten Sie wahrscheinlich Folgendes tun :grep -n '' | sed 'H;/{$/h;/^[^:]*:}/x;/{\n.*PATTERN/!d'
. Allen Ausgabezeilen werden die Zeilennummern der Originaldatei vorangestellt, gefolgt von einem Doppelpunkt wie1:sometext1{\n2:string1
usw.sed
filtert nur das, was zuvor gefiltert wurde, außer dass jede Ausgabezeile mit einer Nummer geöffnet wird.Antworten:
Hier sind zwei Befehle. Wenn Sie einen Befehl wünschen, der bis zur letzten
.*{$
Zeile in einer Sequenz gekürzt wird (wie bei @don_crisstied
) , können Sie Folgendes tun:... das funktioniert, indem jede Zeile nach
H
einem\n
Ewline-Zeichen an das alte Leerzeichen angehängt wird, dash
alte Leerzeichen für jede übereinstimmende Zeile überschrieben{$
wird undh
alte und Muster-Leerzeichen für jede übereinstimmende Zeile ausgetauscht werden^}
- und dadurch der Puffer geleert wird.Es werden nur Zeilen gedruckt, die mit einer
{
dann einer\n
ewline und dannPATTERN
irgendwann übereinstimmen - und das geschieht immer nur unmittelbar nach einem Pufferwechsel.Es entfernt alle Zeilen in einer Reihe von
{$
Übereinstimmungen bis zur letzten in der Sequenz, aber Sie können alle diese einschließlich erhalten, wie:Dabei werden Muster und
h
alte Leerzeichen für jede...{$.*^}.*
Sequenz vertauscht, alle Zeilen innerhalb der Sequenz nachH
einem\n
Ewline-Zeichen an das alte Leerzeichen angehängt und für jeden ZeilenzyklusD
bis zum ersten vorkommenden\n
Ewline-Zeichen im Musterraum gelöscht, bevor erneut mit dem verbleibenden Zeichen begonnen wird.Natürlich wird
\n
im Musterbereich nur dann eine neue Zeile angezeigt, wenn eine Eingabezeile übereinstimmt^}
- das Ende Ihres Bereichs - und wenn das Skript bei einer anderen Gelegenheit erneut ausgeführt wird, wird nur die nächste Eingabezeile wie gewohnt eingezogen.Wenn
PATTERN
es sich im selben Musterbereich wie eine\n
Ewline befindet, wird das Los gedruckt, bevor es^}
erneut überschrieben wird (damit der Bereich beendet und der Puffer geleert werden kann) .Angesichts dieser Eingabedatei (danke don) :
Die ersten Drucke:
...und der zweite...
quelle
}
. Dies könnte von Vorteil sein für ...open{\nsub;\n{ command; }\n}; close
- aber ich bin nicht sicher, ob das hier so ist ...{...}
Blöcken enthalten sind? Wenn dies der Fall ist und Sie die erste Lösung verwenden, können Sie dies/{$/,/^}/H
am Anfang tun, anstatt nurH
. Wenn Sie jedoch auch die zweite Lösung ausprobiert haben und dennoch denselben Fehler festgestellt haben, ist dies wahrscheinlich nicht hilfreich, da diese Lösung dies bereits tut. Und auch keinen Rabatted
. Don bekam eine sehr gute Antwort hier unded
angewandt werden kann temporäre Puffer zu verwenden , Dateien sehr einfach als auch, was mem Überschreitungen Puffer verhindern sollte.Hier ist eine Lösung mit
ed
:das ist:
Dies setzt voraus, dass
PATTERN
zwischen jedem Paar nur eine Zeile steht,{
}
andernfalls erhalten Sie für jede weitere ZeilePATTERN
innerhalb desselben Blocks eine doppelte Ausgabe .Es funktioniert für mehrere,
{
}
die eine einzelne Zeilenübereinstimmung enthalten,PATTERN
z. B. für eine Testdatei mitPATTERN
zwei verschiedenen Abschnitten:Laufen
Ausgänge:
quelle
Mit
pcregrep
:Oder mit GNU,
grep
sofern die Eingabe keine NUL-Bytes enthält:quelle
wo:
string4
-> übereinstimmende Zeichenfolget1.txt
-> enthält den in der Abfrage genannten Dateiinhaltquelle
sed -n '/ string / p' Dateiname
Wenn -n zu sed hinzugefügt wird, wird das Standardverhalten von sed unterdrückt. Diese Anweisung gibt Ihnen möglicherweise nicht genau das, was Sie möchten, sondern sollte nur die Zeichenfolge verschieben
quelle