두 패턴 사이의 선을 선택적으로 삭제

두 패턴 사이의 선을 선택적으로 삭제

다음 내용이 포함된 파일이 있습니다.

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.

작동 방식:

  1. -v f=1

    awk 변수를 f만들고 1.

  2. /world/{f=0}

    현재 줄에 가 포함되어 있으면 world변수를 f0으로 설정합니다.

  3. /Activity|task/{f=1}

    줄에 Activity또는 중 하나가 포함되어 있으면 task로 설정 f합니다 1.

    world위와 Activity/또는 task여기가 정규식으로 처리된다는 점에 유의하세요 . 또한 대소문자를 구분합니다.

  4. 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 && /./f0이 아닌 경우에만 행을 인쇄하도록 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

의 사용에 주목하세요 //. 이는 이전에 사용된 정규식을 의미합니다. :)

관련 정보