Jak grep na fajkę |

14

Jak mogę grepować dla wiersza zawierającego znak potoku |lub dla znaku >:

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

teraz potrzebuję polecenia grep

grep -iE "<some expression>" file_name

Wynik:

|this is test
where is >
Özzesh
źródło

Odpowiedzi:

10

Ze standardową grepskładnią:

grep '[>|]'

lub

grep -e '>' -e '|'

lub

grep '>
|'

lub

grep -E '>|\|'
Stéphane Chazelas
źródło
6

Jeśli używasz GNU grep, możesz to zrobić za pomocą operatora lub ( |), który powinien być poprzedzony znakiem ucieczki (poprzedzonym odwrotnym ukośnikiem \). Aby znaleźć wiersze zawierające znak potoku lub znak większy niż, dołącz je dosłownie do operatora lub :

grep '|\|>' infile

Wynik:

|this is test
where is >
Thor
źródło
4
\|nie jest standardowym BREoperatorem, choć współpracuje z GNU, grepktóry grepwystępuje w większości systemów operacyjnych zbudowanych wokół jądra Linux.
Stéphane Chazelas,
@StephaneChazelas: dziękuję za zwrócenie na to uwagi, nie byłem tego świadomy. Poprawiłem tekst.
Thor
1
Tak, operator alternacji jest jedynym prawdziwym dodatkiem ERE w stosunku do BRE, a reszta ( +, ?) to cukier syntaktyczny dla \{1,\}i \{0,1\}. (z drugiej strony, ERE tracą referencje ( \(.\)\1), które są funkcją tylko BRE)
Stéphane Chazelas,
1

Używanie wyrażenia w nawiasach w celu dopasowania jednego z poszukiwanych znaków:

grep "[|>]" infile

Wynik:

|this is test
where is >
zagrimsan
źródło
3
Nie ma potrzeby ani tutaj, -iani -Etutaj.
Stéphane Chazelas,
To prawda, potwierdzono.
zagrimsan,
0

Prawidłowym sposobem na osiągnięcie tego jest użycie flagi -e określonej przez POSIX. Na przykład:

grep -e '>\||' infile
Valentin Bajrami
źródło
1
grep -e '>' -e '|' infileteż działa.
ott--
2
-ejest określony przez POSIX, ale tutaj nie jest użyteczny. \|nie jest określony przez POSIX.
Stéphane Chazelas,