다음 출력을 생성하는 스크립트가 있습니다.
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)»
}
'