sed возвращает несколько результатов следующего слова в одной строке - PullRequest
2 голосов
/ 21 июня 2019

Можно ли вернуть несколько результатов следующего слова, используя один запрос sed

Строка:

profile string.www.com { app-service none cert string.www.com_2018_2020.crt cert-key-chain { string.www.com _2018_2020_geotrust_rsa_ca_2018 { cert string.www.com _2018_2020.crt chain geotrust_rsa_ca_2018.crt key string.www.com_2018_2020.key } } chain geotrust_rsa_ca_2018.crt defaults-from default-clientssl inherit-certkeychain false key string.www.com_2018_2020.key passphrase none }

Так, например, что-то вроде:

sed -n 's/^.*\(profile \|defaults-from \| passphrase) \([^ ]*\).*/\1/p'

Вернется:

string.www.com
default-clientssl
none

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

Это может сработать для вас (GNU sed):

sed -En '/\n/!s/(profile|defaults-from|passphrase) \S+/\n&\n/g;/^(profile|defaults-from|passphrase)/P;D' file

Окружать требуемые ключи и значения символами новой строки и печатать эти ключи и значения только тогда, когда они представляются в начале строки.

Для вывода только значения:

sed -En '/\n/!s/(profile|defaults-from|passphrase) \S+/\n&\n/g;/^(profile|defaults-from|passphrase)/{s/\S+ //;P};D' file
1 голос
/ 21 июня 2019

Вы не можете легко извлечь несколько совпадений в одной строке с sed, поскольку его шаблоны всегда "жадные".Вы можете сделать это в два этапа:

sed 's/\(profile\|defaults-from\|passphrase\) \([^ ]*\)/\nXXX\2XXX\n/g' <<< "$s" | \
 sed -n 's/^XXX\(.*\)XXX$/\1/p'

Сначала оберните совпадения с помощью XXX и новых строк, а затем захватите эти совпадения с помощью sed -n 's/^XXX\(.*\)XXX$/\1/p'.См. эту онлайн-демонстрацию .

Если вы хотите использовать «пошаговый» вариант, вы можете извлечь эти тексты намного проще с помощью grep.

GNU grep solution:

grep -oP '(profile|defaults-from|passphrase)\s+\K\S+' file

Или с pcregrep:

pcregrep -o '(profile|defaults-from|passphrase)\s+\K\S+' file

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

...