Wie greife ich nach Pfeife?

14

Wie kann ich nach einer Zeile mit einem Pipe-Zeichen |oder nach einem Zeichen suchen >:

files content:
|this is test
where is >
this is none

Was ich jetzt mit grep Befehl brauche, ist

grep -iE "<some expression>" file_name

Ausgabe:

|this is test
where is >
Özzesh
quelle

Antworten:

10

Mit Standard- grepSyntax:

grep '[>|]'

oder

grep -e '>' -e '|'

oder

grep '>
|'

oder

grep -E '>|\|'
Stéphane Chazelas
quelle
6

Wenn Sie GNU grep verwenden, können Sie dies mit dem Operator oder ( |) tun , dem ein Backslash vorangestellt werden soll \. Um also Zeilen zu finden, die entweder eine Pipe oder ein Größer-als-Zeichen enthalten, schließen Sie sie wörtlich mit dem Operator oder ein :

grep '|\|>' infile

Ausgabe:

|this is test
where is >
Thor
quelle
4
\|kein Standard ist BREOperator, wenn es mit der GNU arbeitet , grepdie das ist grepbei den meisten anderen Betriebssystemen um einen Linux - Kernel integriert.
Stéphane Chazelas
@StephaneChazelas: Danke für den Hinweis, ich war mir dessen nicht bewusst. Ich habe den Text korrigiert.
Thor
1
Ja, der Alternationsoperator ist die einzige echte Hinzufügung von EREs gegenüber BREs, der Rest ( +, ?) ist syntaktischer Zucker für \{1,\}und \{0,1\}. (Auf der anderen Seite verlieren EREs Rückverweise ( \(.\)\1), die nur eine BRE-Funktion sind)
Stéphane Chazelas
1

Verwenden des Klammerausdrucks, um eines der gewünschten Zeichen zu finden:

grep "[|>]" infile

Ausgabe:

|this is test
where is >
Zagrimsan
quelle
3
Keine Notwendigkeit für entweder -ioder -Ehier.
Stéphane Chazelas
Das ist wahr, anerkannt.
Zagrimsan
0

Der richtige Weg, dies zu erreichen, ist die Verwendung des von POSIX angegebenen Flags -e. Z.B:

grep -e '>\||' infile
Valentin Bajrami
quelle
1
grep -e '>' -e '|' infilefunktioniert auch.
ott--
2
-ewird von POSIX angegeben, ist aber hier nicht nützlich. \|wird von POSIX nicht angegeben.
Stéphane Chazelas