我需要从一个串联的SQL语句中提取所有主机变量。输入示例:
select * from table where :first-var || :second-var
为此,我需要提取“ first-var”和“ second-var”。
匹配一个或另一个可以使用:
grep -o -E ':\S+\s+\|\|'
匹配':first-var ||' 和
grep -o -E '\|\|\s+:\S+'
匹配” || :第二变种'
但是,当我以交替模式组合这两个表达式时,仅返回一个结果:
grep -o -E '\|\|\s+:\S+|:\S+\s+\|\|'
将命令拆分为多个模式还仅匹配一个结果:
grep -o -E -e '\|\| :second-var' -e ':first-var \|\|'
我怀疑在第一个匹配项后管道符号“用完了”,因为以下内容确实返回了两个结果:
grep -o -E -e '\| :second-var' -e ':first-var \|'
如何获得所有比赛?请注意,串联符号不必是输出的一部分,在此示例中,我仅对“ first-var”和“ second-var”感兴趣。
问题是找到后:first-var ||
,|| :second-var
剩余的文本中就没有剩余了。grep -o
只能打印不重叠的部分线。
您可以这样做:
$ perl -lne 'print for /:\S+\s+\|\|/g, /\|\|\s+:\S+/g' file
:first-var ||
|| :second-var
(所有:var ||
s都印在|| :var
s之前)。
或者,如果只需要:var
一部分,则使用grep
带有PCRE支持的GNU :
$ grep -Po ':\S+(?=\s+\|\|)|\|\|\s+\K:\S+' file
:first-var
:second-var
如同:
perl -lne 'print for /:\S+(?=\s+\|\|)|\|\|\s+\K:\S+/g'
现在,如果您要提取:foo
并:bar
在始终形状为的直线中提取,则anything :foo || :bar
可以使用以下方法进行标准处理:
s='[[:space:]]\{1,\}' S='[^[:space:]]\{1,\}'
sed -n "/\(:$S\}\)$s\{1,\}||$s\(:$S\).*/{
s//\
\1\
\2/
s/.*\n\(.*\n\)/\1/p
}'
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句