<table name="content_analyzer" another-key="id9">
<type="global" />
</table>
<table name="content_analyzer2" another-key="id12">
<type="global" />
</table>
<table name="content_analyzer" primary-key="id9">
<type="global" />
</table>
<table name="content_analyzer2" primary-key="id12">
<type="global" />
</table>
<table name="content_analyzer_items" primary-key="id56">
<type="global" />
</table>
如果我想提取名称的值,那么:
grep -Po 'name="\K.*?(?=")'
但我该如何同时处理名称和主键的值呢?例如,下面的行不起作用。
grep -Po 'name="\K.*?(?=") primary-key="\K.*?(?=")'
所以它看起来像
content_analyzer id9
content_analyzer2 id12
content_analyzer_items id56
答案1
使用sed
:
$ sed -nr 's/^[^\s]+\sname="([^"]+)"\s.*primary-key="([^"]+)">$/\1 \2/p' file.txt
content_analyzer id9
content_analyzer2 id12
content_analyzer_items id56
与 PCRE 一起使用,grep
您可以获得:
$ grep -Po '(name|primary-key)="\K[^"]+' file.txt
content_analyzer
id9
content_analyzer2
id12
content_analyzer_items
id56
答案2
您可以使用以下方法来完成awk
:
$ awk '{for(i=1; i<=NF; i++){if($i~/^name=/ || $i~/^primary-key=/){print $i}}}'
结果:
name="content_analyzer"
name="content_analyzer2"
name="content_analyzer"
primary-key="id9">
name="content_analyzer2"
primary-key="id12">
name="content_analyzer_items"
primary-key="id56">
awk
将搜索name=
orprimary-key=
并打印该字段的值。
答案3
你不能使用环视正则表达式按预期选择线条的多个部分。
然而,由于您使用 perl 语法,也许perl
它本身是一个更好的选择:
$ perl -ne 'print if s/.*name="(.*?)".*primary-key="(.*?)".*/\1 \2/' file
content_analyzer id9
content_analyzer2 id12
content_analyzer_items id56
这不使用任何环视构造,并且是不言自明的。