是否可以多次使用 grep Lookaroud ?

是否可以多次使用 grep Lookaroud ?
<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

这不使用任何环视构造,并且是不言自明的。

相关内容