Grep с использованием регулярного выражения и захват с использованием групп - PullRequest
2 голосов
/ 31 мая 2019

У меня есть несколько текстовых файлов, содержащих строки, как показано ниже: "" "Версия: 3.4.0.0 ххх ххх ххх «»» Я пытаюсь захватить 3.4.0.0 из каждого текстового файла и отобразить на терминале. Команда, которую я написал, такова:

grep -m1 'Version[\s\S]*?(\d[\s\S]+?)\n' *.txt

grep -m1 'Version[\s\S]*?(\d[\s\S]+?)\n' *.txt

Я не могу получить никаких результатов, используя приведенный выше код. Может ли кто-нибудь помочь мне в этом?

1 Ответ

2 голосов
/ 31 мая 2019

Ваш шаблон является регулярным выражением, совместимым с PCRE, [\s\S] соответствует любому символу в шаблоне PCRE, но не с использованием регулярного выражения POSIX BRE, которое вы используете со своим grep, поскольку вы не использовали опцию -P.

Если вы хотите сделать это с помощью GNU grep, используйте

grep  -oPm 1 'Version\s*:\s*\K\d+(?:\.\d+)+' *.txt

См. это онлайн-демо

Подробности

  • Version - Version строка
  • \s*:\s* - двоеточие, заключенное в 0+ пробелов
  • \K - оператор сброса совпадений
  • \d+ - 1+ цифр, а затем
  • (?:\.\d+)+ - 1 или более повторений . и 1+ цифр.

Вы можете сделать это с помощью awk:

awk '/^Version : [0-9]+/{print $3; exit}' *.txt

См. online awk demo :

s="Text
Version : 3.4.0.0 xxx xxx xxx
More text
Version : 5.6.0.0 xxx xxx xxx"
awk '/^Version : [0-9]+/{print $3; exit}' <<< "$s"
# => 3.4.0.0

Подробнее

  • ^Version : [0-9]+ находитстрока, начинающаяся с Version : <1 or more digits>
  • {print $3; exit}, выводит значение поля 3 и останавливает обработку, получая только первое совпадение.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...