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

sed返回一个字符串上的多个下一个单词结果,sed,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.w

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

使用
sed
很难在同一行上提取多个匹配项,因为它的模式总是“贪婪的”。您可以通过两个步骤完成此操作:

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

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

这可能适合您(GNU-sed):

用换行符围绕所需的键和值,仅当这些键和值出现在行首时才打印它们

要仅输出值,请执行以下操作:

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

不,
sed
模式总是“贪婪的”。您需要
grep
。类似于
grep-oP'(profile |来自|密码短语的默认值)\K\S+'
。请参阅。但是,这超出了OP的预期(输出包含左侧上下文)。现在,它可以工作,但仍然不是一个命令。半小时前,我在回答中还发布了一个两步
sed
解决方案。@WiktorStribiżew OP说“是否可以使用单个sed查询返回多个下一个单词结果”,而不是单个sed命令。据我所知
用于分隔
sed
命令,请参阅:分号(“;”)可用于分隔大多数简单命令。不过,我不确定这是否完全相关,因为它仍然意味着几个“步骤”。@WiktorStribiżew OP从不使用单词command,而是说“一个sed查询”。在这种情况下,我所理解的查询是使用sed程序的单个调用请求信息。您的sed解决方案/解决方案使用两个调用,通过unix管道连接。
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