Как grep для трубы |

14

Как я могу grep для строки, содержащей символ трубы |или для символа >:

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

Теперь, что мне нужно с помощью команды grep

grep -iE "<some expression>" file_name

Выход:

|this is test
where is >
Özzesh
источник

Ответы:

10

Со стандартным grepсинтаксисом:

grep '[>|]'

или

grep -e '>' -e '|'

или

grep '>
|'

или

grep -E '>|\|'
Стефан Шазелас
источник
6

Если вы используете GNU grep, вы можете сделать это с помощью оператора или ( |), который должен быть экранирован (с обратной косой чертой \). Таким образом, чтобы найти строки, содержащие либо трубу, либо знак «больше, чем», включите их буквально с помощью оператора или :

grep '|\|>' infile

Выход:

|this is test
where is >
Тор
источник
4
\|не является стандартным BREоператором, хотя он работает с GNU, grepкоторый grepвстречается в большинстве операционных систем, построенных на ядре Linux.
Стефан Шазелас
@ StephaneChazelas: спасибо за указание на это, я не знал об этом. Я исправил текст.
Тор
1
Да, оператор чередования является единственным реальным добавлением ERE к BRE, а остальные ( +, ?) являются синтаксическим сахаром для \{1,\}и \{0,1\}. (с другой стороны, ERE освобождают обратные ссылки ( \(.\)\1), которые являются только функцией BRE)
Стефан Шазелас
1

Использование выражения в скобках для сопоставления с любым из требуемых символов:

grep "[|>]" infile

Выход:

|this is test
where is >
zagrimsan
источник
3
Нет необходимости либо -iили -Eздесь.
Стефан Шазелас
Это правда, признал.
Загримсан
0

Правильный способ сделать это - использовать флаг -e, указанный в POSIX. Например:

grep -e '>\||' infile
Валентин Байрами
источник
1
grep -e '>' -e '|' infileтоже работает
ot--
2
-eопределяется POSIX, но здесь не используется. \|не указывается в POSIX.
Стефан Шазелас