와 같은 명령줄 도구를 사용하여 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 스타일에 대한 훌륭한 설명입니다.