sed에 문자열이 나타나기 전과 도중에 모든 텍스트를 제거하는 방법

sed에 문자열이 나타나기 전과 도중에 모든 텍스트를 제거하는 방법

이 작업을 수행하는 방법을 기억하고 Stack Exchange에서도 배웠지만 Google에서 어떻게 검색했는지 잊어버려서 지금은 찾을 수 없습니다. 지금 찾은 답은 내가 원하는 답이 아니다. 다음은 샘플 텍스트입니다.

The quick
brown fox
jumps over
the lazy
dog

sed가 "jum"이라고 표시되기 전과 "jum"이라고 표시될 때 모든 것을 삭제하기를 원하므로 출력은 다음과 같습니다.

ps over
the lazy
dog

어떻게 해야 하나요?

답변1

sed -ne '1,/^jum/{s/^jum//p;d;}' -e p

@Sundeep이 의견에서 지적했듯이 GNU sed가 있으면 를 사용하는 것이 더 좋습니다 sed -ne '0,/^jum/{s/^jum//p;d;}' -e p. jum이는 첫 번째 줄에서도 작동합니다. 그렇지 않다 1,/^jum/.

그 기능은 다음과 같습니다.

  • sed -n: 지시가 없는 한 아무것도 인쇄하지 마십시오.
  • 1,/^jum/: 첫 번째 줄과 include로 시작하는 줄 사이의 줄 jum:
    • s/^jum//p: 줄 시작 부분의 "jum"을 제거할 수 있으면 결과를 인쇄합니다.
    • d: 그리고 다음 줄로 계속
  • -e p: 다른 모든 줄은 인쇄하면 됩니다.

답변2

GNU를 사용 sed하고 파일이 메모리에 들어갈 만큼 작다고 가정하면 다음을 수행할 수 있습니다.

$ sed -z 's/.*jum//' file 
ps over
the lazy
dog

-z입력을 NUL로 구분 하여 처리하도록 지시합니다 sed. 즉, NUL( \0)이 각 줄의 끝을 나타낼 것으로 예상합니다. 파일에 NUL 문자가 없으므로 sed는 전체 파일을 한 줄로 처리하므로 s///전체 작업을 단일 작업으로 수행할 수 있습니다.

참고로 이 항목을 찾을 수 있습니다.마지막 jum이전 내용을 모두 삭제하세요. 이전에 다른 사례가 있는 경우 jum콘텐츠가 삭제됩니다.

답변3

그리고 awk:

$ awk 'sub(/^jum/, ""){f=1} f' ip.txt
ps over
the lazy
dog

교체가 성공하면 플래그를 설정하여 행을 인쇄합니다.

관련 정보