É possível usar o lookaroud do grep várias vezes?

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

se eu quiser extrair o valor do nome, então:

grep -Po 'name="\K.*?(?=")'

mas como faço para o valor do nome e da chave primária ao mesmo tempo? Por exemplo, a linha abaixo não funciona.

grep -Po 'name="\K.*?(?=") primary-key="\K.*?(?=")'

para que pareça

content_analyzer id9
content_analyzer2 id12
content_analyzer_items id56
    
por munish 03.04.2016 / 15:20

3 respostas

2

Usando sed :

$ sed -nr 's/^[^\s]+\sname="([^"]+)"\s.*primary-key="([^"]+)">$/ /p' file.txt
content_analyzer id9
content_analyzer2 id12
content_analyzer_items id56

Usando grep com o PCRE, você pode obter:

$ grep -Po '(name|primary-key)="\K[^"]+' file.txt                         
content_analyzer
id9
content_analyzer2
id12
content_analyzer_items
id56
    
por 03.04.2016 / 15:28
0

Você pode fazer isso usando awk :

$ awk '{for(i=1; i<=NF; i++){if($i~/^name=/ || $i~/^primary-key=/){print $i}}}'

Resultado:

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 pesquisará name= ou primary-key= e imprimirá o valor desse campo.

    
por 03.04.2016 / 15:36
0

Você não pode usar o regexp lookaround para selecionar várias partes da linha como pretendido.

No entanto, como você usa a sintaxe perl, talvez perl seja a melhor opção:

$ perl -ne 'print if s/.*name="(.*?)".*primary-key="(.*?)".*/ /' file
content_analyzer id9
content_analyzer2 id12
content_analyzer_items id56

Isso não usa nenhuma construção visual e é autoexplicativo.

    
por 03.04.2016 / 16:21