Bash: Wie kann ich grep eine Zeile für mehrere Instanzen der gleichen Zeichenfolge?
Ich habe mehrere Zeilen, die wie folgt Aussehen:
aaaaaaaaxzaaaaaaaaaaaaaa
bbbbbbbbbbbbxzbbbbbbxzbb
ccxzcccccccccccccccccxzc
dddddddxzddddddddddddddd
In zwei von diesen Linien, es gibt zwei Instanzen xz
Zeichen. Ich möchte grep zu suchen xz
zweimal in der gleichen Zeile und die Ausgabe der Zeilen, dass es übereinstimmungen auf. Wenn xz
erscheint einmal, ich will es gar nicht wissen.
Den folgenden Befehl ausführen:
cat lines | grep "xz"
Sagt mir jede Zeile, die mit xz auf, aber ich will nur sehen, Linien, die mit " xz " erscheinen zweimal.
Wie kann ich die Suche wiederholen in der gleichen Zeile?
cat lines | grep -oP 'xz.*xz'
?- das funktioniert stribizhev, danke
- Keine Notwendigkeit für
-P
oder-o
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
Oder nur
Den
.*
entsprechen optionalen Zeichen (außer Zeilenumbruch) zwischen 2xz
.In Fall müssen Sie die Verwendung von look-around, müssen Sie
-P
Schalter zu aktivieren, wie in Perl regexps.-o
xz
Ihre grep wird, drucken Sie es aus zu. pls fixxz
ist^(?:(?:(?!xz).)*xz){2}(?:(?!xz).)*$
. Von OP ' s feedback, es scheint, es muss mindestens 2xz
.awk ist ein Weg zu gehen:
oder
ein weiterer Vorteil awk bringt Sie ist, ist es einfacher zu überprüfen, ein Muster abgestimmt
less then n times
,exact n times
odergreater than n times
. ändern Sie einfach die==
in<, <=, >, >=
Wenn Sie möchten, um die Ausgabe der übereinstimmenden Zeilen in full Sie nicht brauchen, die Optionen
tun
[x-z]\{2\}
und du wirst sehen, dass "xy abc-yx" passt ebenso gut wie "xy abc xy". Im Allgemeinen ich denke, die Lösung sollte nur die Angabe der Muster, das auf einmal. Ich kann dieses geschehen, aber bisher nicht mit einem einfachen Muster entsprechen.grep -E '(..).*\1'
entsprechen, in denen sich zwei chars wiederholt werden, aber das ist nicht das, was gefragt worden hier,,,