Регулярное выражение grep -r 'emm*[af].[^ta]$'

Я нашел ответ

sed -E 's/[-1] / 9/' file1 > file2

могу выполнить работу

4
26.10.2019, 11:32
1 ответ

Слово emmailloterсодержит гораздо больше, чем iмежду битами, соответствующими [a-f]и [^ta]$. Шаблон .всегда соответствует только одному символу, поэтому, если вы хотите сопоставить несколько символов между emmaи rв конце, вам придется разрешить несколько символов:

emm*[a-f]..*[^ta]$

Еслиgrep -E(включить расширенные регулярные выражения ), ..*можно записать как .+, то есть «соответствовать хотя бы одному символу». Выражение ..*читается как «соответствие символу, а затем, возможно, большему количеству символов». Точно так же emm*можно заменить на em+, т.е. "eс последующим хотя бы одним m" при использовании grep -E.

Это будет соответствовать строке

blop-emmmmmmmmma-blarg-b
     ^^^^^^^^^^^^^^^^^^^
     1111111111233333334

1: emm*
2: [a-f]
3:..*
4: [^ta]$

(совпадающая часть, обозначенная символами ^выше ), например, а такжеemmailloter:

emmailloter
^^^^^^^^^^^
11123333334

Тестирование:

$ grep -E 'emm*[a-f].+[^ta]$' MySQLServ
remembré
emmené
emmailloter
flemmard

Обратите внимание, что для слова remembréсоответствие будет

remembré
 ^^^^^^^
 1123334

не

remembré
   ^^^^^
   11234

Один из способов визуализации совпадений с использованиемsed:

$ sed -n -E 's/(emm*)([a-f])(.+)([^ta]$)/(\1)(\2)(\3)(\4)/p' MySQLServ
r(em)(e)(mbr)(é)
(emm)(e)(n)(é)
(emm)(a)(illote)(r)
fl(emm)(a)(r)(d)

Будут напечатаны только совпадающие строки, где каждая совпавшая часть регулярного выражения заключена в круглые скобки. Это также предполагает, что вы используете реализацию sed, которую можно использовать для сопоставления французских символов, и что переменные среды локали правильно настроены для этого.

Сравните это с исходным выражением:

$ sed -n -E 's/(emm*)([a-f])(.)([^ta]$)/(\1)(\2)(\3)(\4)/p' MySQLServ
rem(em)(b)(r)(é)
(emm)(e)(n)(é)
fl(emm)(a)(r)(d)
6
27.01.2020, 20:51

Теги

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