是否可以使用单个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
答案 0 :(得分:2)
这可能对您有用(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 :(得分:1)
使用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'
抓住那些比赛。参见this online demo。
如果您需要“单步执行”解决方案,则可以使用grep
轻松提取这些文本。
GNU grep解决方案:
grep -oP '(profile|defaults-from|passphrase)\s+\K\S+' file
或者,用pcregrep
:
pcregrep -o '(profile|defaults-from|passphrase)\s+\K\S+' file
请参见this online demo。