我想知道最好,最简单的方法来仅打印regex
匹配。
老兄说你有这个正则表达式 ab[a-z][0-9]+xyz
以及以下数据:
cat file
her are my databc653xyzc test
some data abc12345xyzmore
what abx764xyzyes thisa sdabu9483xyzfk
not this data
然后我想得到这个结果:
abc653xyz
abc12345xyz
abx764xyz abu9483xyz
这是我发现似乎可行的结果:
awk
版本:
awk -F¤ '$0~reg {gsub(reg,"¤&¤");for (i=2;i<=NF;i+=2) printf "%s ",$i;print ""}' reg="ab[a-z][0-9]+xyz" file
abc653xyz
abc12345xyz
abx764xyz abu9483xyz
如果数据确实包含¤
或使用任何字符作为字段分隔符,它将失败。
A gnu awk
(打印第二个匹配,但在单独的行上)
awk -v RS="ab[a-z][0-9]+xyz" 'RT{print RT}' file
abc653xyz
abc12345xyz
abx764xyz
abu9483xyz
sed
版本(缺少第二个匹配项)
sed -n 's/^.*\(ab[a-z][0-9]\+xyz\).*$/\1/p' file
abc653xyz
abc12345xyz
abx764xyz
用途grep
:
grep -oP 'ab[a-z][0-9]+xyz' filename
它也适用于一行上的任何点击数。
$ cat file
her are my databc653xyzc test xyabc42xyzghi
some data abc12345xyzmore
what abx764xyzyes
not this data
$ grep -oP 'ab[a-z][0-9]+xyz' file
abc653xyz
abc42xyz
abc12345xyz
abx764xyz
如果您需要输入中的一行上有多个匹配项才能出现在输出中的同一行上,则可以使用perl:
perl -lne '@m = $_ =~ /(ab[a-z][0-9]+xyz)/g; print join(" ",@m) if @m' inputfile
这将产生:
abc653xyz abc42xyz
abc12345xyz
abx764xyz
上面示例中的示例输入。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句