#linux #grep
#linux #grep
Вопрос:
Рассмотрим следующий пример, где grep
используется для поиска в двоичном режиме:
$ echo "test blabla test ertytey" | grep -ao tes
tes
tes
Я могу добавить «точку» в шаблон поиска, чтобы «сопоставить любой символ» и показать следующий символ после совпадения:
$ echo "test blabla test ertytey" | grep -ao tes.
test
test
… или больше точек, чтобы соответствовать последующим символам:
$ echo "test blabla test ertytey" | grep -ao tes...
test b
test e
Допустим, теперь я хочу сопоставить несколько символов (скажем, 30, нет: 3) после совпадения; и я читаю из man grep
: {n} Предыдущий элемент сопоставляется ровно n раз .. Поэтому я пытаюсь:
$ echo "test blabla test ertytey" | grep -ao tes.{3}
$
… ничего не происходит;
$ echo "test blabla test ertytey" | grep -ao tes.{3}
$
… ничего не происходит;
$ echo "test blabla test ertytey" | grep -ao tes[.]{3}
$
… ничего не происходит;
$ echo "test blabla test ertytey" | grep -ao tes[.]{3}
$
… ничего не происходит.
Есть идеи, каким будет правильный синтаксис для сопоставления «любого символа» (точка) заданное количество раз в двоичном режиме grep?
Заранее большое спасибо за любые ответы,
приветствия!
РЕДАКТИРОВАТЬ: как указывает ответ @aix, изначально я допустил ошибку, указав 30 символов для поиска, тогда как строка в примере недостаточно длинная 🙂 Теперь изменили его на более разумное количество 3 🙂
Комментарии:
1. Настоятельно рекомендуется заключать ваш шаблон в одинарные кавычки, чтобы предотвратить нежелательное расширение Bash определенных символов.
2. Подтверждено — спасибо за это @heltonbiker, хорошие ответы также отражают это; приветствия!
Ответ №1:
Прежде всего, {30}
соответствует ровно тридцати символам, и ваша строка недостаточно длинная.
Во-вторых, вашему grep может потребоваться -E
флаг для включения расширенного синтаксиса (у меня есть).
Для меня работает следующее:
$ echo "test blabla test ertytey" | grep -aoE 'tes.{20}'
test blabla test ertyte
Комментарии:
1.
egrep
также иногда доступен и эквивалентенgrep -E
.2. Да, у вас ДОЛЖНО быть как минимум указанное количество символов в вашем strig, иначе оно не будет совпадать. Если вам нужно не БОЛЕЕ 30 символов, вы можете использовать
grep -aoE 'tes.{1,30}'
, что означает, что за tes следует от одного до тридцати символов. Стоит отметить, чтоgrep -E
это эквивалентноegrep
.3. Потрясающе, большое спасибо за ответ! Кроме того, извините, я писал OP слишком быстро — теперь изменен для правильных символов… Еще раз спасибо, всем привет!
Ответ №2:
echo "test blabla test ertytey" | grep -aoE 'tes.{3}l'