구문 분석하려는 텍스트 파일이 있습니다.
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
작동하지 않음). 나는 perl
or 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'