sed在一个字符串上返回多个下一个单词的结果

时间:2019-06-21 08:10:39

标签: sed

是否可以使用单个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 个答案:

答案 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