Sie verwenden ein ODER |
zwischen Ihren Mustern, Sie möchten ein UND.
In Ihrem Muster, bist du "to_addr":"\K(\d+)
aber ich Ihr Beispiel für den Wert to_addr
ist, ABCD
damit es nicht mit übereinstimmen \d+
und es gibt einen Raum zwischen "to_addr:
und "ABCD"
, gleich für content
.
Wenn to_addr
immer vor content
:
grep -P '^\d-\d-\d\s\d:\d:\d.*?"to_addr": "\d+.*?"content": ".+?"'
Sonst nur Lookaheads verwenden:
grep -P '^\d-\d-\d\s\d:\d:\d(?=.*?"to_addr": "\d+)(?=.*?"content": "(.+?)")'
Wenn Sie nur die Übereinstimmungen drucken möchten, empfehle ich einen Perl-Einzeiler:
perl -ane 'print "$1\t$2\t$3\n" if (/^(\d-\d-\d\s\d:\d:\d)(?=.*?"to_addr": "(\d+))(?=.*?"content": "(.+?)")/)' file