Grep не показывает результаты, онлайн тестер регулярных выражений - PullRequest
3 голосов
/ 16 ноября 2010

Я довольно неопытен с поведением grep. У меня есть куча файлов XML, которые содержат такие строки:

<identifier type="abc">abc:def.ghi/g1234.ab012345</identifier>
<identifier type="abc">abc:def.ghi/g5678m.ab678901</identifier>

Я хотел получить часть идентификатора после косой черты и построил регулярное выражение, используя RegexPal :

[a-z]\d{4}[a-z]*\.[a-z]*\d*

Это подчеркивает все, что я хотел. Отлично. Теперь, когда я запускаю grep для того же файла, я не получаю никаких результатов. И, как я уже сказал, я действительно не очень разбираюсь в grep, поэтому я попробовал все разные комбинации.

grep [a-z]\d{4}[a-z]*\.[a-z]*\d* test.xml
grep "[a-z]\d{4}[a-z]*\.[a-z]*\d*" test.xml
egrep "[a-z]\d{4}[a-z]*\.[a-z]*\d*" test.xml
grep '[a-z]\d{4}[a-z]*\.[a-z]*\d*' test.xml
grep -E '[a-z]\d{4}[a-z]*\.[a-z]*\d*' test.xml

Что я делаю не так?

Ответы [ 7 ]

8 голосов
/ 16 ноября 2010

Ваше регулярное выражение не соответствует вводу.Давайте разберемся с этим:

  • [a-z] совпадений g
  • \d{4} совпадений 1234
  • [a-z]* не совпадение .

Кроме того, я считаю, grep и семье не нравится синтаксис \d.Попробуйте либо [0-9], либо [:digit:]

Наконец, при использовании регулярных выражений, предпочитайте от egrep до grep.Я не помню точных деталей, но egrep поддерживает больше операторов регулярных выражений.Кроме того, во многих оболочках (включая bash в OS X, как вы упомянули, используйте одинарные кавычки вместо двойных, в противном случае * будет расширен оболочкой до списка файлов в текущем каталоге, прежде чем grep его увидит (и другие оболочки).метасимволы тоже будут расширены). Bash ничего не трогает в одинарных кавычках.

5 голосов
/ 16 ноября 2010

grep не поддерживает \d по умолчанию.Чтобы сопоставить цифру, используйте [0-9] или разрешите регулярные выражения, совместимые с Perl:

$ grep -P "[a-z]\d{4}[a-z]*\.[a-z]*\d*" test.xml

или:

$ egrep "[a-z][0-9]{4}[a-z]*\.[a-z]*[0-9]*" test.xml
3 голосов
/ 16 ноября 2010

grep использует "базовые" регулярные выражения: (отрывок из man-страниц)

Basic vs Extended Regular Expressions
   In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their
   special meaning; instead use the backslashed versions \?, \+, \{,  \|,  \(,  and
   \).

   Traditional  egrep  did  not  support  the  {  meta-character,  and  some  egrep
   implementations support \{ instead,  so  portable  scripts  should  avoid  {  in
   grep -E patterns and should use [{] to match a literal {.

   GNU  grep -E  attempts  to  support  traditional usage by assuming that { is not
   special if it would be the start of  an  invalid  interval  specification.   For
   example,  the  command  grep -E '{1'  searches  for  the two-character string {1
   instead of reporting a syntax error in the regular expression.   POSIX.2  allows
   this behavior as an extension, but portable scripts should avoid it.

Также в зависимости от того, какая оболочка, которую вы выполняете в символе '*', может быть расширена.

1 голос
/ 16 ноября 2010

Вы можете использовать следующую команду:

$ cat file
<identifier type="abc">abc:def.ghi/g1234.ab012345</identifier>

# Use -P option to enable Perl style regex \d.
$ grep -P  '[a-z]\d{4}[a-z]*\.[a-z]*\d*' file
<identifier type="abc">abc:def.ghi/g1234.ab012345</identifier>

# to get only the part of the input that matches use -o option:
$ grep -P -o '[a-z]\d{4}[a-z]*\.[a-z]*\d*' file
g1234.ab012345

# You can use [0-9] inplace of \d and use -E option.
$ grep -E -o '[a-z][0-9]{4}[a-z]*\.[a-z]*[0-9]*' file
g1234.ab012345
$ 
0 голосов
/ 16 ноября 2010

Попробуйте это выражение в grep:

[a-z]\d{4}[a-z]*\.[a-z]*\d*
0 голосов
/ 16 ноября 2010

Попробуйте:

[az] \ d {5} [.] [Az] {2} \ d {6}

0 голосов
/ 16 ноября 2010

для начала, не используйте regexp для разбора xml / html. Смотрите этот классический пост RegEx соответствует открытым тегам, кроме автономных тегов XHTML

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...