나는 이 질문 을보고 순수 POSIX
를 사용sed
하는
내 대답을
어떻게 구현할 수 있는지 궁금해했다 .ex
요령은 sed
홀드 공간과 패턴 공간을 비교하여 패턴 공간과 정확히 같은지 여부를 확인할 수는 있지만 (와
G;/^\(.*\)\n\1$/{do something}
) 같은 테스트를 수행 할 방법이 없다는 것입니다 ex
.
나는 빔에 내가 할 수있는 것을 알고 Y
첫 번째 줄을 ANK 다음 입력
:2,$g/<C-r>0/d
에 거의 내가 지정-그러나있어 일을 첫 번째 줄은 아무 것도 포함하지만 라인이로 덤프되는 때문에 매우 간단 영숫자 텍스트이, 참으로 위태로운이되면
정규식 비교 용 문자열이 아닙니다. (그리고 첫 번째 줄에 슬래시가 있으면 나머지 줄은 명령으로 해석됩니다!)
따라서 myfile
첫 번째 줄과 동일한 모든 줄을 삭제하고 싶지만 첫 번째 줄은 삭제하지 않으려면 어떻게해야 ex
합니까? 그 문제에 대해 어떻게 사용할 수 vi
있습니까?
다른 줄과 정확히 일치하는 줄을 삭제하는 POSIX 방법이 있습니까?
아마도이 가상 구문과 같은 것입니다 :
:2,$g/**lines equal to "0**/d
<C-r>0
아주 좋습니다. 특수 문자를 보호해야하기 때문에 Ex 명령으로 만 더 잘 수행 할 수 있는지 확실하지 않습니다. POSIX 호환 제약 조건이 없으면 매우 nomagic 스위치를 사용하고 두 번째 인수가 이스케이프 / 보호하려는 모든 문자가 포함 된 문자열 인 함수로 \V
백 슬래시를 보호 한다고 생각합니다 (와도 특별한 의미를 유지하기 때문에 \V
) escape()
.
:execute '2,$g/\V' . escape(getline(1), '\/') . '/d'
또는 세미콜론과 같이 패턴 구분 기호에 다른 문자를 사용할 수 있습니다. 이 경우 패턴에서 슬래시를 보호 할 필요가 없습니다. : 그것은 같은 줄 것이다:execute '2,$g;\V' . escape(getline(1), '\') . ';d'
sed
도 매우 좋습니다. Vim을 사용하면 특정 특수 작업을 다른 프로그램에 위임하는 경우가 많으며 이에 sed
대한 좋은 예일 것입니다. 그건 그렇고, 당신은 sed
전체 버퍼 에서 실행할 필요가 없습니다 . 버퍼의 일부에서만 실행하려는 경우 범위를 지정할 수 있습니다. 예를 들어 50과 100 사이의 행만 필터링하려면 다음과 같이 입력하십시오 :50,100!<your sed command>
..
:execute '2,$g/\V' . escape(getline(1), '\') . '/d'