특정 문자열 뒤에 여러 줄이 있는지 확인하는 방법은 무엇입니까?

특정 문자열 뒤에 여러 줄이 있는지 확인하는 방법은 무엇입니까?

다음 출력을 생성하는 스크립트가 있습니다.

URL:
 http://framework.com

Name(s):
 Patching Framework
----------------------------------------------------------

URL:
 http://asjkdfhn.com

Name(s):
 jadsbfkjdfhn dsjfkh
----------------------------------------------------------

URL:
 http://wusdh.com

Name(s):
 Wholesale Underwear dark health
----------------------------------------------------------
URL:
 http://wertyuiioofn.com

Name(s):
 werthyeshfd asjfdhn
 ajdsfbndjfb dsjfhndjfhn
 dkfmdkfm dkfjkdjf
----------------------------------------------------------

URL:
 http://google.com

Name(s):
 Google
 Google, Phillipines
----------------------------------------------------------

여러 이름이 나열된 URL/이름만 인쇄/반향하고 싶습니다.

예: 위의 URL/이름에서 다음을 인쇄하세요.

URL:
 http://wertyuiioofn.com

Name(s):
 werthyeshfd asjfdhn
 ajdsfbndjfb dsjfhndjfhn
 dkfmdkfm dkfjkdjf
----------------------------------------------------------

URL:
 http://google.com

Name(s):
 Google
 Google, Phillipines
----------------------------------------------------------

bash/shell 스크립트를 사용하여 이 작업을 수행할 수 있습니까?

답변1

이것은 작동합니다. 이 명령 뒤에 파일 이름을 추가합니다.

sed -n '
       /URL:/{
              :addanotherrow
              N
              /-\{50,\}/bmatchandprint
              baddanotherrow
              :matchandprint
              /Name(s):[^\n]*\n[^-\n]*\n[^-]/p
              }
       '

몇 가지 설명:

  • sed 매개변수 "-n"은 패턴 공간의 자동 인쇄를 방지합니다. 일치하는 패턴은 대괄호 {} 안의 문의 마지막 줄 끝에 "p"를 사용하여 인쇄됩니다.
  • 태그는 앞에 ":"으로 표시되어 있으므로 ":addanotherrow" 및 ":matchandprint"는 "b" 문에 대한 점프 포인트입니다.
  • b 뒤에 레이블이 오면 해당 레이블로 분기하는 명령입니다(GOTO와 유사).
  • N 패턴 공간에 다음 입력 줄을 추가합니다.
  • "/"로 시작하는 줄은 정규식에 따라 패턴 공간을 증명합니다. 정규식이 적합하면 이미 언급한 대로 다음 명령을 실행합니다. b 분기 및 p는 패턴 공간을 인쇄합니다.

즉, 문자열 "URL:"을 검색하면 한 줄이 발견될 때까지 더 많은 줄이 포함됩니다(한 줄에 최소 50개의 하이픈 포함). 그런 다음 수집된 라인("패턴 공간")을 검사합니다. 패턴 공간은 "name:"의 라인(하이픈으로 시작하지 않음)이 두 개 이상 발견된 경우에만 인쇄됩니다.

도움이 되었기를 바랍니다 :-)

답변2

sed -n '
       /URL:/{
              :1                          #return point
              N                           #append next line
              /-{20,}/!b1                 #go to return point while reach ---
              /Name(s):\n[^\n]\+\n[^-]/p  #check if more 1 line after «Name(s)»  
              }
       '

관련 정보