Я виконую команду 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