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

이는 둘러보기 구성을 사용하지 않으며 설명이 필요하지 않습니다.

관련 정보