Grep nie pokazuje żadnych wyników, pokazuje tester regex online


Jestem niedoświadczony w zachowaniu grepa. Mam kilka plików XML, które zawierają takie linie:
<identifier type="abc">abc:def.ghi/g1234.ab012345</identifier>
<identifier type="abc">abc:def.ghi/g5678m.ab678901</identifier>

Chciałem uzyskać część id po ukośniku i zbudować regex przy użyciu

RegexPal
http://regexpal.com/
:
[a-z]\d{4}[a-z]*\.[a-z]*\d*

Podkreśla wszystko, czego chciałem. Ideał. Teraz, gdy uruchamiam grep na tym samym pliku, nie otrzymuję żadnych wyników. I jak powiedziałem, naprawdę niewiele wiem o grep, więc wypróbowałem wszystkie różne kombinacje.
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

Co ja robię źle?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Twoje wyrażenie regularne nie pasuje do danych wejściowych. Zrozummy to:
  • [a-z]
    odpowiada wyrażeniu
    g
  • \ d 0000-00-00
    pasuje do
    1234
  • [a-z] *
    nie pasuje do
    .

Uważam również, że
grep
i rodzina nie lubią składni
\ d
. Spróbuj
[0-9]
lub
[: digit:]
Na koniec, używając wyrażeń regularnych, preferuj
egrep
grep
. Nie pamiętam dokładnych szczegółów, ale
egrep
obsługuje więcej instrukcji regex. Ponadto w wielu powłokach (w tym bash na OS X, jak wspomniałeś, używaj pojedynczych cudzysłowów zamiast podwójnych cudzysłowów, w przeciwnym razie
*
rozszerzy powłokę do listy plików w bieżącym katalogu zanim grep ją zobaczy (i inne metaznaki powłoki również zostaną rozwinięte). Bash nie zmienia niczego w pojedynczych cudzysłowach.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

grep
nie obsługuje domyślnie
\ d
. Aby dopasować cyfrę, użyj
[0-9]
lub zezwól na wyrażenia regularne zgodne z Perl:
$ grep -P "[a-z]\d{4}[a-z]*\.[a-z]*\d*" test.xml

lub:
$ egrep "[a-z][0-9]{4}[a-z]*\.[a-z]*[0-9]*" test.xml
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Grep używa wyrażeń regularnych "podstawowych": (Fragment z stron człowieka)
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.

Ponadto, w zależności od tego, jaką powłokę wykonujesz w znaku „*”, można ją rozwinąć.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz użyć następującego polecenia:
$ 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
$
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Spróbuj:
[a-z]\d{5}[.][a-z]{2}\d{6}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wypróbuj to wyrażenie w języku grep:
[a-z]\d{4}[a-z]*\.[a-z]*\d*
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

na początek nie używaj wyrażenia regularnego do analizowania xml/html. Zobacz ten klasyczny wpis

RegEx pasuje do otwartych tagów innych niż samodzielne tagi XHTML
https://coderoad.ru/1732348/

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się