Регулярное выражение для нахождения двойных символов в Bash

Википедия имеет хорошую статью о процессе запуска Linux.

Сегодня, обычно initramfs используется.

10
13.04.2017, 15:36
3 ответа

Это действительно - два вопроса и должно было быть разделено. Но так как ответы относительно просты, я помещу их здесь. Эти ответы для GNU grep конкретно.

a) egrep совпадает с grep -E. Оба указывают, что "Расширенные регулярные выражения" должны использоваться вместо grepРегулярные выражения по умолчанию. grep требует обратных косых черт для простых Регулярных выражений.

От man страница:

Основной по сравнению с расширенными регулярными выражениями

В основных регулярных выражениях метасимволы?, +, {|, (и) теряют их особое значение; вместо этого используйте backslashed версии \?, \+, \{, \|, \(, и \).

Посмотрите man страница для дополнительных деталей об исторических конвенциях и мобильности.

b) Использовать egrep '(.)\1{N}' и замена N с количеством символов Вы хотите заменить минус один (так как точка соответствует первому). Таким образом, если Вы хотите соответствовать символу, повторенному четыре раза, использовать egrep '(.)\1{3}'.

9
27.01.2020, 20:01
  • 1
    При чтении страницы справочника я, должно быть, действительно неправильно понял или неправильно истолковал часть, на которую Вы указали. Когда я работал через некоторые учебные руководства по регулярному выражению не было никаких подсказок такого поведения, которое будет ожидаться. Я думал, что Регулярное выражение означает что-то на таком базовом уровне, что большинство приложений работает с тем же набором символов. Снова, я был доказан неправым.Спасибо за помощь! Это действительно выручило меня. –  erch 03.04.2013, 00:13
  • 2
    Это - также довольно запутывающее чтение, "всегда используют обратную косую черту для взятия особого значения от символов такой как., +, и т.д." и затем узнавая, что по-видимому противоположное является правилом с самой основной командой. –  erch 03.04.2013, 00:17
  • 3
    @cellar.dweller Это сбивает с толку! Большое обоснование является историческим. Я более знаком с Расширенной формой, таким образом, я делаю привычку к всегда просто использованию egrep если мне нужны регулярные выражения (в противоположность просто простой строке, соответствующей) так, чтобы я не волновался о запоминании различий между grepдва типа регулярных выражений. –  depquid 03.04.2013, 00:19
  • 4
    Обратите внимание, что стандартные EREs не поддерживают обратные ссылки, в то время как стандартные BREs делают. Так grep '\(.\)\1\{3\}' является стандартным, grep -E '(.)\1{3}' не. –  Stéphane Chazelas 03.04.2013, 00:32

Это искало бы 2 или больше происшествия того же символа:

grep -E '(.)\1+' file

Если бы Ваш awk имеет-o опцию, это распечатало бы его каждое соответствие на новой строке..

grep -Eo '(.)\1+' file

Найти соответствия точно с 3 соответствиями:

grep -E '(.)\1{2}' file

Или 3 или больше:

grep -E '(.)\1{2,}' file

и т.д.


править

На самом деле @stephane_chazelas прав относительно обратных ссылок и-E. Я забыл об этом. Я попробовал его в BSD grep и GNU grep, и это работает там, но это не находится в некоторых других властях. Необходимо было бы использовать один из ниже версии..

Регулярные grep версии:

grep '\(.\)\1\{1,\}' file

grep -o '\(.\)\1\{1,\}' file

grep '\(.\)\1\{2\}' file

grep '\(.\)\1\{2,\}' file

-o опция является также не стандартным grep BTW (вероятно, если Ваш grep понимает,-o это может также сделать обратную ссылку)..


Примечание: grep -E '(.)\1{2,}' файл и grep '\(.\)\1\{2\}' файл является неправильным как alexis обозначенный и должен быть проигнорирован..

6
27.01.2020, 20:01
  • 1
    Благодарит Вас, до сих пор. Но: Я, исправляют высказывание это без -E опция grep не сделал бы многого? Это объяснило бы довольно много, например, почему я потратил впустую так много времени, ища, где я был неправ! –  erch 03.04.2013, 00:02
  • 2
    Без-E опции, можно сделать то же в этом случае, но необходимо было бы выйти из больше и существует нет + оператор.. Я отправлю примеры также. –  Scrutinizer 03.04.2013, 08:56
  • 3
    маленькое исправление: grep -E '(.)\1{2}' точно "Не находит соответствия точно с 3 соответствиями". В то время как это будет соответствовать точно трем идентичным символам, они могут быть встроены в более длинную повторную строку; например, это будет соответствовать в строке с 5 символами AAAAA. (И если будет 6 или больше последовательных символов, то это будет соответствовать несколько раз). –  alexis 11.05.2016, 16:48
  • 4
    Да Вы абсолютно правы, который не работает, как предназначено, на самом деле это не возможно как этот.. –  Scrutinizer 13.05.2016, 10:02

Во-первых, спасибо всем за Ваши комментарии поддержки и предложения. Как оказалось, я был уже вполне близко к ответу.

Основной вопрос был о:

Есть ли простой способ искать n происшествия того же символа, например. aa, tttttt

Короткий ответ:

Следующее [изменения] команды повторится a по крайней мере один и бесконечные времена

grep 'a\{1,}

grep -E \(a\)\{1,\}

egrep a{1,}

или, с доступными Регулярными выражениями GNU grep a\+


Номер повторений определяется в фигурных скобках через шаблон {min,max}{n} повторитесь точно n времена, {n,} повторитесь, по крайней мере, n времена и {n,m} повторитесь, по крайней мере, n но самое большее m времена.

Таким образом, как следствие, поднял вторичный вопрос:

Необходимость установки обратных реакций связана с командой, которую я использую?

Короткий ответ: Да, использование обратных косых черт зависит от того, использует ли каждый grep или egrep

  • grep: обратная косая черта активируется, метасимволы [использует Основные Регулярные выражения]
  • egrep обратная косая черта деактивируется, метасимволы [использует Расширенные регулярные выражения]

Поскольку это - короткий ответ, я хочу предоставить тем, кто столкнулся с сопоставимыми проблемами, я добавил свою основную сводку того, о чем по-видимому нужно знать, работая с grep и egrep.




Основной, расширенный, и регулярные выражения GNU

Основные регулярные выражения

Используемый в grep, ed и sed команда

Основные функции набора Регулярных выражений:

  • Большинство Метасимволов, например. ? [ . \ ) и т.д. активируются через обратную косую черту. Если не будет никакой обратной косой черты, то они будут взяты в качестве (часть) критерий поиска.
  • ^ $ \< и \> поддерживаются без обратной косой черты
  • Никакие краткие символы [\b, \s, и т.д.]

GNU Основные Регулярные выражения добавляет к ним

  • \? повторите символьный нуль или одно время (c\? соответствия cи cc) и альтернатива для \{0,1\}
  • \+ повторите символ по крайней мере в один раз, когда (c\+ соответствия cc, cccccccc и т.д.), и альтернатива для \{1,\}

  • \| поддерживается (например. grep a\|b будет искать a или b

grep -E позволяет команде использовать полный набор Расширенных регулярных выражений:


Расширенные регулярные выражения [ERE]

Используемый в egrep, awk и emacs Основной набор плюс некоторые функции.

  • Метасимволы деактивируются через обратную косую черту
  • Никакие обратные ссылки
  • еще: много из волшебные Регулярные выражения обычно может делать для одного

GNU регулярные выражения Extendend

добавляет следующие опции

Две ссылки направят тот к постоянному-клиенту-expressions.info, который, в дополнение к потрясающей поддержке я здесь, действительно помог мне много.

3
27.01.2020, 20:01

Теги

Похожие вопросы