как grep все между одинарными кавычками? - PullRequest
0 голосов
/ 09 октября 2018

У меня проблемы с выяснением, как подбирать символы между двумя одинарными кавычками.

У меня есть это в файле version: '8.x-1.0-alpha1'

, и мне нравится иметь такой вывод (номера версий могут быть различными):

8.x-1.0-alpha1

Я написал следующее, но оно не работает:

cat myfile.txt | grep -e 'version' | sed 's/.*\?'\(.*?\)'.*//g'

Спасибо за вашу помощь.

Дополнение: я использовал команду sed sed -n "s#version:\s*'\(.*\)'#\1#p" Мне также нравится удалять 8.x-, который я отредактировал до sed -n "s#version:\s*'8.x-\(.*\)'#\1#p".

Эта команда работает только в Linux и не работает в MAC.Как изменить эту команду, чтобы она работала на MAC?

sed -n "s#version:\s*'8.x-\(.*\)'#\1#p"

Ответы [ 5 ]

0 голосов
/ 10 октября 2018

Если вы хотите посмотреть только его цитаты, вы можете использовать cut.

grep -e 'version' myfile.txt | cut -d "'" -f2
0 голосов
/ 09 октября 2018

Я бы использовал GNU grep с регулярными выражениями pcre:

grep -oP "version: '\\K.*(?=')" file

, где мы ищем "version:", и тогда директива \K забудет только что увиденное, оставив .*(?=')соответствовать последней одинарной кавычке.

0 голосов
/ 09 октября 2018

Если вы просто хотите получить эту информацию из файла, и только то, что вы можете быстро сделать:

awk -F"'" '/version/{print $2}' file

Пример:

$ echo "version: '8.x-1.0-alpha1'" | awk -F"'" '/version/{print $2}'
8.x-1.0-alpha1

Как это работает?

Программа awk - это серия пар шаблон-действие, записанная в виде:

condition { action }
condition { action }
...

, где condition обычно является выражением, а action - набором команд..

  1. -F "'": Здесь мы говорим , чтобы определить разделитель полей FS как'.Это означает, что все строки будут разделены на поля $1, $2, ..., $NF и между каждым полем будет '.Теперь мы можем ссылаться на эти поля, используя $1 для первого поля, $2 для второго ... и т. Д., И это до $NF, где NF - общее количество полей в строке.

  2. /version/{print $2}: Это пара условие-действие.

    • условие: /version/ :: Условие гласит: Если подстрока в текущей записи / строке соответствует регулярному выражению /version/, тогда выполните action.Здесь это просто переводится как , если текущая строка содержит подстроку version

    • action: {print $2} :: Если выполнено предыдущее условие, тонапечатать второе поле.В этом случае второе поле будет тем, что запрашивает OP.

Теперь есть несколько вещей, которые можно сделать.

  1. Улучшение condition до /^version :/ && NF==3, которое гласит _Если текущая строка начинается с подстроки version : и в текущей строке есть 3 поля, тогда выполните action

  2. Если вам нужен только первый случай, вы можете указать системе exit сразу после поиска, обновив действие до {print $2; exit}

0 голосов
/ 09 октября 2018

grep почти может сделать это в одиночку:

grep -o "'.*'" file.txt

Но это также может вывести строки, которые вам не нужны: он напечатает все строки с двумя одинарными кавычками (') в них,И вывод по-прежнему имеет одинарные кавычки (') вокруг него:

'8.x-1.0-alpha1'

Но только sed может сделать это правильно:

sed -rn "s/^version: +'([^']+)'.*/\1/p" file.txt
0 голосов
/ 09 октября 2018

Попробуйте что-то вроде этого: sed -n "s#version:\s*'\(.*\)'#\1#p" myfile.txt.Это позволяет избежать избыточных cat и grep путем нахождения строки «version» и извлечения содержимого между одинарными кавычками.

Объяснение:

флаг -n указывает sed непечатать строки автоматически.Затем мы используем команду p в конце нашего шаблона sed для явной печати при обнаружении строки версии.

Поиск шаблона: version:\s*'\(.*\)'

  • version:\s* Соответствует «версии», за которой следует любое количество пробелов
  • '\(.*\)' Соответствует одному ', затем захватывает все до следующего '

Замените на: \1;Это первая (и единственная) описанная выше группа захвата, содержащая содержимое между одинарными кавычками.

...