/ / grep не повертає очікуваного результату з регулярним виразом на xml - regex, grep, centos

grep не повертає очікуваного результату за допомогою регулярного виразу xml - regex, grep, centos

Я виконую команду grep на деяких xml, і, здається, неправильно трактую регулярний вираз, який я намагаюся використовувати.

Ось команда

grep "<ernm:NewReleaseMessage.*?>" ./075679942012_ORIGNAL.xml

що, здається, відбувається, це те, що ?> аспект регулярного виразів, як видається, не викликає відповідності, а не відповідності першому виникненню >

Будь-які ідеї?

Відповіді:

2 для відповіді № 1

Якщо ви хочете отримати текст до першого появи > символу, то спробуйте команду нижче,

 grep -o "<ernm:NewReleaseMessage[^>]*>" file

Якщо потрібно весь рядок, тоді видаліть -o параметр

Приклад:

$ cat aa1.txt
<ernm:NewReleaseMessage blah> foo bar>
$ grep -o "<ernm:NewReleaseMessage[^>]*>" aa1.txt
<ernm:NewReleaseMessage blah>

grep з -o друкує лише відповідний текст.

[^>]* - Не від > символ нульовий або більше. Таким чином, він відповідає першому появі > характер


2 для відповіді № 2

За замовчуванням використовує grep основний регулярний вираз і вважає ? як буквальний знак питання. Щоб це вважалося синтаксисом регулярного вираження, вам потрібно уникнути цього символу.

grep "<ernm:NewReleaseMessage.*?>" ./075679942012_ORIGNAL.xml

Ви можете скористатись -E варіант, який інтерпретує шаблон як розширений регулярний вираз.

grep -E "<ernm:NewReleaseMessage.*?>" ./075679942012_ORIGNAL.xml

Примітка: Це вище поверне весь рядок, що відповідає вашому шаблону, якщо ви хочете лише відповідність тексту, використовуйте -o опція, яка друкує лише відповідні частини відповідних ліній.

grep -o "<ernm:NewReleaseMessage.*?>" ./075679942012_ORIGNAL.xml

АБО

grep -Eo "<ernm:NewReleaseMessage.*?>" ./075679942012_ORIGNAL.xml