다음 내용이 포함된 파일이 있습니다.
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
f
0이 아닌 경우 해당 행을 인쇄합니다.
빈 줄도 삭제하세요
$ 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
//
사용하기 전에 정규식 사용을 주의하세요 :)