Grep: повторяющиеся символы в двоичном режиме?

#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'