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>

name 値を抽出するには、次のようにします。

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">

awkname=または、primary-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

これはツアー設定を使用せず、説明は必要ありません。

関連情報