이 작업을 수행하는 방법을 기억하고 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
교체가 성공하면 플래그를 설정하여 행을 인쇄합니다.