У меня есть несколько текстовых файлов, содержащих строки, как показано ниже: """Версия: 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
Я не могу получить какие-либо результаты, используя приведенный выше код. Может ли кто-нибудь помочь мне в этом?
Ваш шаблон является регулярным выражением, совместимым с 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
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 и прекращает обработку, получая только первое совпадение.