여러 줄 검색과 ​​일치하는 정규식

여러 줄 검색과 ​​일치하는 정규식

구문 분석하려는 텍스트 파일이 있습니다.

Host server1
     option1 value1
     option2 value2
     option3 value3
     ...
Host server2
     option1 value1
     option2 value2
     option3 value3
     ...
Host server3
     option1 value1
...

목표는 입력에 이름(예: server2)을 제공하면 다음을 반환하는 것입니다.

Host server2
     option1 value1
     option2 value2
     option3 value3
     ...

그런 다음 다음 정규식을 작성하고 온라인 정규식 놀이터에서 테스트해 보았습니다.효과가있다예상대로.

/((Host server2\n)(^ +.+\n*)+)/gm

grep하지만 이 정규식을 , sed또는 perl과 같은 일부 Linux 도구에 적용하는 방법을 모르겠습니다 awk. 시도해 보았지만 grep여러 줄 검색에서는 작동하지 않습니다. 플래그를 사용하여 작동 -z하지만 여전히 정규식이 작동하도록 할 수 없습니다(를 사용하여 시도했지만 -Pzo작동하지 않음). 나는 perlor awk(정규 표현식의 경우) 에 익숙하지 않습니다 .

그래서 내 현재 솔루션은 다음을 사용하는 것입니다 sed -n '/foo/,/bar/p' input_file.

string="server1"

search=$(cat input_file | grep Host | grep -w -A1 "$string")
foo=$(head -1 <<< "$search")
bar=$(tail -1 <<< "$search")

sed -n "/$foo/,/$bar/p" input_file | head -n -1

이는 예상대로 작동하지만 정규식 접근 방식을 보고 싶습니다. 한 가지 더, 추가 도구를 설치하고 싶지 않습니다.

답변1

거의 다 왔습니다. grep regex는 슬래시 안에 있는 작은 세부 사항을 좋아하지 않습니다./.../

  • (?m)한 가지 더, 캐럿을 사용하여 ^줄의 시작(새 줄 오른쪽 위치)과 문자열의 맨 처음을 나타낼 수 있도록 여러 줄 일치 모드를 켭니다 . 이는 다음을 통해 액세스할 수도 있습니다. \A.
  • grep은 NULL 접미사가 있는 블록을 출력하므로 이를 제거해야 합니다.
  • 나머지는 당신이 가진 전부이므로 어쨌든 정규식이 어떻게 일치하는지 알 수 있습니다.

grep -Pzo '(?m)((^Host server2\n)( +.+\n*)+)' file | tr -d '\0'

관련 정보