grep eine Zeile vor dem Spiel plus das Spiel

8
zzzzzzzzz
aaaaaaaaa
bbbbbbbbb &
ccccccccc &
ddddddddd
hhhhhhhhh
eeeeeeeee
fffffffff &
ggggggggg &

In der obigen Zeile möchte ich eine grep/ sed/ awk(jede Methode ist in Ordnung) Zeile mit einem &Vorzeichen und einer Zeile darüber. So sieht beispielsweise die gewünschte Ausgabe folgendermaßen aus:

aaaaaaaaa
bbbbbbbbb &
ccccccccc &
eeeeeeeee
fffffffff &
ggggggggg &

Folgendes habe ich ohne Glück versucht.

egrep "&" | -b 1 file.txt
Rana Khan
quelle

Antworten:

16

Du kannst tun:

grep -B 1 '&$' your_file

Dadurch wird nach Zeilen gesucht &, die $mit enden . Entfernen Sie diese, um sie mit einer &beliebigen Stelle in ihnen abzugleichen.

Der -BSchalter weist grepan, "Kontext" -Zeilen auszugeben, die vor den übereinstimmenden Zeilen stehen. In diesem Fall benötigen Sie eine Kontextzeile, da Sie diese benötigen -B 1.

Dieser Schalter ist in GNU verfügbar, grepjedoch nicht im POSIX-Standard.

Hier ist eine einfache sedLösung, die helfen sollte, falls Sie keine GNU haben grep:

sed -n '/&/!N;/&/p' your_file

Wie es funktioniert

  • Der -nSchalter unterdrückt die Standardaktion "Drucken" vonsed
  • /&/!Nbedeutet: Wenn die aktuelle Zeile nicht enthält &, hängen Sie die nächste Zeile an den Musterbereich an.
  • /&/pbedeutet: &Passen Sie den Musterbereich an und drucken Sie ihn aus.
Joseph R.
quelle
2
@RanaKhan Willkommen bei Stack Exchange :) Ich bin froh, dass ich helfen konnte. Bitte vergessen Sie nicht, diese Antwort als akzeptiert zu markieren (verwenden Sie das Häkchen unter den Abstimmungsschaltflächen neben der Antwort), wenn dies zur Lösung Ihres Problems beigetragen hat, damit andere Benutzer der Website wissen, dass dieses Problem behoben ist.
Joseph R.
+1 für die Variante, wenn GNU/grepnicht verfügbar, danke!
ckujau
3

Hier ist , wie zu emulieren grep -B1mit sed:

sed '$!N;/pattern/P;D' infile

Es ist sehr ähnlich den man hier . Genau wie beim anderen wird die Next-Zeile Peingelesen , diesmal jedoch bis zur ersten \newline, wenn der Musterraum übereinstimmt , und dann, genau wie beim anderen, Dbis zur ersten \newline elettiert und der Zyklus neu gestartet. Also mit Ihrer Beispieleingabe:

sed '$!N;/&/P;D' infile

Ausgänge:

aaaaaaaaa
bbbbbbbbb &
ccccccccc &
eeeeeeeee
fffffffff &
ggggggggg &

Um zu sehen, wie es funktioniert, fügen Sie lvor und nach dem hinzu N, um den Musterbereich zu betrachten:

sed 'l;$!N;l;/&/P;D' infile

zB mit einer Beispieldatei:

zzzz &
aaaa
bbbb
cccc &
dddd &
hhhh
eeee
ffff &
gggg &

Dies sind die Befehle, die sedausgeführt werden, und die entsprechende Ausgabe:

cmd Ausgabe cmd
l       zzzz &$               N # read in the next line
l       zzzz &\naaaa$         # pattern space matches so print up to \n
P       zzzz &                D # delete up to \n 
l       aaaa$                 N # read in the next line
l       aaaa\nbbbb$           D # delete up to \n (no match so no P)
l       bbbb$                 N # read in the next line
l       bbbb\ncccc &$         # pattern space matches so print up to \n
P       bbbb                  D # delete up to \n
l       cccc &$               N # read in the next line
l       cccc &\ndddd &$       # pattern space matches so print up to \n
P       cccc &                D # delete up to \n
l       dddd &$               N # read in the next line
l       dddd &\nhhhh$         # pattern space matches so print up to \n
P       dddd &                D # delete up to \n
l       hhhh$                 N # read in the next line
l       hhhh\neeee$           D # delete up to \n (no match so no P)
l       eeee$                 N # read in the next line
l       eeee\nffff &$         # pattern space matches so print up to \n
P       eeee                  D # delete up to \n
l       ffff &$               N # read in the next line
l       ffff &\ngggg &$       # pattern space matches so print up to \n
P       ffff &                D # delete up to \n
l       gggg &$               # last line so no N 
l       gggg &$               # pattern space matches so print up to \n
P       gggg &                D # delete up to \n
don_crissti
quelle