특정 구문이 포함된 줄을 제거하지만 다른 단어가 포함된 줄은 피하고 싶습니다.

특정 구문이 포함된 줄을 제거하지만 다른 단어가 포함된 줄은 피하고 싶습니다.

특정 단어가 포함된 줄을 삭제하는 방법. 단, 다른 단어가 발견되면 해당 줄을 삭제하지 마세요. 예를 들어, sup또는 이 있는 행을 삭제 gnd하지만 루프 라인을 끊는 일부 행도 삭제합니다 :%s/.*sup.*//g.:%s/.*gnd.*//g

moduleor와 같은 행에 있는 행을 삭제하고 싶지 않습니다 . 이 라인을 정복하는 방법을 알고 계십니까?gndsup

답변1

당신이 사용할 수있는:

:v/module/s/\v.*(sup|gnd).*//
  • :v/pattern/cmdcmd실행 라인에서 실행아니요패턴 일치
  • \v열려 있는환상적이다이런 방식으로 모든 문자 (|접두사 없이 정규식 연산자로 처리됩니다 \.

참고하시기 바랍니다비어 있는하지만 그 외에는 안돼제거하다sup또는 을 포함하는 라인 gnd. 이를 제거하려면 g/ 명령을 중첩할 수 없으므로 하나의 명령에 부정 예측 정규식 연산자를 사용할 v수 있습니다 .vimg

:g/\v^(.*module)@!.*(sup|gnd)/d
  • :g/pattern/cmdcmd줄을 달리고 있다하다패턴 일치
  • (pattern)@!(그리고환상적이다)는 다음과 같은 경우 너비가 0과 일치합니다.무늬해당 위치에는 일치 항목이 없으므로 ^(.*module)@!포함되지 않은 줄 시작 부분에 일치 항목이 있습니다 module.

sed또는 로 파이프하는 옵션도 있습니다 awk.

:%!sed -e /module/b -e /sup/d -e /gnd/d
  • /module/b.module
  • 포함하지 않은 행의 경우 다음 두 명령을 계속 실행하여 sup또는 각각 포함된 행을 삭제합니다 gnd.

또는:

:%!awk '/sup|gnd/ && ! /module/'

네가 원한다면찾다이 줄을 제거하고 삭제해야 하는 파일의 경우 건너뛰고 vim텍스트 처리 유틸리티를 사용하여 전체 작업을 완료할 수 있습니다. GNU 시스템에서:

find . ! -name '*.back' -type f -size +3c -exec gawk '
  /sup|gnd/ && ! /module/ {printf "%s\0", FILENAME; nextfile}' '{}' + |
  xargs -r0 sed -i.back -e /module/b -e /sup/d -e /gnd/d

(여기서 원본 파일의 백업은 로 저장되며 the-file.back, 백업이 필요하지 않은 경우 로 변경하십시오.) -i.back.-i

  • find.back이름이 로 끝나지 않고 크기가 최소 4바이트인 일반 파일을 찾고 (작은 파일에는 sup또는 gnd(및 줄 구분 기호)을 포함하는 줄이 포함될 가능성이 낮음) gawk해당 파일의 경로를 인수로 사용하여 실행합니다.
  • gawk어떤 파일에서든 일치하는 줄이 발견 되면 FILENAMENUL 문자(의 경우 xargs -0)로 구분된 파일 경로(특수 변수)를 인쇄하고 다음 파일로 이동합니다.
  • xargs -r0gawk출력 프로세스는 이러한 파일 경로를 인수로 사용하여 실행됩니다.sed
  • sed파일을 제자리에서 편집하세요.

답변2

v/(module\|input\|output)/s/\v인 것으로 확인되었습니다../

관련 정보