다음 내용이 포함된 파일이 있습니다.
Hello world Unix!!
Its bright world
Current time is HH:mm:ss
Next action plan is item #3
End of task.
Thank you.
Hello world Linux!!
All actions completed.
End of Activity.
Thanks.
특정 키워드 집합(예: "활동" 또는 "작업")이 있는 줄이 나타날 때까지 키워드 "세계"가 포함된 모든 줄과 모든 후속 줄을 선택적으로 삭제하고 싶습니다.
원하는 출력:
End of task.
Thank you.
End of Activity.
Thanks.
답변1
노력하다:
$ awk -v f=1 '/world/{f=0} /Activity|task/{f=1} f' File
End of task.
Thank you.
End of Activity.
Thanks.
작동 방식:
-v f=1
awk 변수를
f
만들고1
./world/{f=0}
현재 줄에 가 포함되어 있으면
world
변수를f
0으로 설정합니다./Activity|task/{f=1}
줄에
Activity
또는 중 하나가 포함되어 있으면task
로 설정f
합니다1
.world
위와Activity
/또는task
여기가 정규식으로 처리된다는 점에 유의하세요 . 또한 대소문자를 구분합니다.f
0이 아닌 경우
f
해당 행을 인쇄합니다.
빈 줄도 삭제하려면
$ awk -v f=1 '/world/{f=0} /Activity|task/{f=1} f && /./' File
End of task.
Thank you.
End of Activity.
Thanks.
f && /./
f
0이 아닌 경우에만 행을 인쇄하도록 awk에 지시합니다.그리고해당 줄에는 모든 종류의 문자가 하나 이상 포함되어 있습니다.
답변2
awk 솔루션만큼 예쁘지는 않지만 OP가 질문에 다음과 같은 태그를 지정했기 때문에sed역시, 여기 있습니다:
#with blank lines
sed '/world/,/task\|Activity/{//!d};/world/d' file
#without blank lines
sed '/world/,/task\|Activity/{//!d};/world\|^$/d' file
의 사용에 주목하세요 //
. 이는 이전에 사용된 정규식을 의미합니다. :)