n번째부터 파일 끝까지 삭제

n번째부터 파일 끝까지 삭제

와 같은 명령줄 도구를 사용하여 n번째 패턴 발생부터 파일 끝까지 내용을 삭제하려면 어떻게 해야 합니까 sed? 예를 들어
다음에서 세 번째 항목을 제거합니다.foo

something
foo1
maybe something else
foo2
maybe not
foo3 -this line and anything after is gone- 
I'm not here

$sed '/magic/'

원하는 결과:

something
foo1
maybe something else
foo2
maybe not

동일한 작업을 수행하지만 세 번째 foo.

답변1

예약된 회선 없음:

awk -v n=3 '/foo/{n--}; n > 0'

줄을 유지하세요:

awk -v n=3 'n > 0; /foo/{n--}'

세 번째 항목을 찾으면 즉시 종료하고 읽기를 중지하도록 이를 약간 개선하고 싶을 수도 있습니다 foo.

awk -v n=3 '/foo/{n--; if (!n) exit}; {print}' # not-keep
awk -v n=3 '{print}; /foo/{n--; if (!n) exit}' # keep

sed더 번거로울 것입니다. foo의 발생을 예약된 공간의 문자 수만큼 유지해야 합니다. 예를 들면 다음과 같습니다.

유지하다:

sed '
  /foo/{
    x;s/^/x/
    /x\{3\}/{
      x;q
    }
    x
  }'

보관되지 않음:

sed -ne '/foo/{x;s/^/x/;/x\{3\}/q;x;}' -e p

답변2

perl다음 과 같이 수락하면명령줄 도구, 당신은 또한 수

perl -ne 'print unless $c>2; ++$c if /foo/' 
perl -ne '++$c if /foo/; print unless $c>2' 

예약 유무.

답변3

대체 답변: vim에서 이 작업을 수행할 수 있습니다. vim을 텍스트 편집기나 명령줄 도구로 사용하여 이 작업을 수행할 수 있습니다. 텍스트 편집기로(줄 포함 또는 제외):

/foo<cr>2ndG:wq<cr>
/foo<cr>2njdG:wq<cr>

몇 가지 중요한 세부 사항: <cr>"입력하다"를 의미합니다. 또한 일반적으로 <n-1>ndG"N"번째 발생 이후에는 삭제해야 합니다. 3개를 요구하셔서 예시에서는 2개를 썼습니다.

명령줄에서만 이 작업을 수행할 수도 있습니다.

vim -c "/foo" -c "normal 2ndG" -c "wq"
vim -c "/foo" -c "normal 2njdG" -c "wq"

이 방법은 정규식에서도 작동합니다.이 웹사이트정규식 vim 스타일에 대한 훌륭한 설명입니다.

관련 정보