VIM 검색 및 바꾸기를 통해 줄 바꿈 수정

VIM 검색 및 바꾸기를 통해 줄 바꿈 수정

이상한 개행 문자가 포함된 파일을 수정하느라 바빴습니다. 여기에 작은 예가 있습니다.

Row ('Row 01') Property ('Property 01')
Row ('Row 02') Property ('Property
02')
Row ('Row 03') Property ('Property 03')

따라서 두 번째 행에는 속성 값에 개행 문자가 있으므로 첫 번째 및 마지막 행과 같이 한 줄이어야 합니다.

VIM에서 다음을 수행하여 수정할 수 있었습니다.

Remove all Line Breaks everywhere
:%s/\n/ /g

이것은 나에게 준다

Row ('Row 01') Property ('Property 01') Row ('Row 02') Property ('Property 02') Row ('Row 03') Property ('Property 03')

그 다음에

Reinsert new Line Breaks only where they are wanted
:%s/ Row/\rRow/g

이것은 내가 원하는 데이터를 제공합니다

Row ('Row 01') Property ('Property 01')
Row ('Row 02') Property ('Property 02')
Row ('Row 03') Property ('Property 03')

문제는 수천 줄의 파일에서 줄 바꿈 문자를 모두 제거하는 것은 속도가 매우 느리기 때문에 불가능하다는 것입니다.

처음에 모든 것을 한 줄로 접지 않고 이를 처리할 수 있는 더 나은 VIM 검색 및 교체 방법이 없는지 궁금합니다.

답변1

gg!Gperl -0 -p -e 's/\n/ /mg; s/ Row/\nRow/mg; s/ \Z/\n/'<enter>
  • gg - 파일의 처음으로 이동
  • !G는 다음을 통해 현재 위치에서 파일 끝까지 파이프합니다.
  • perl -0 -p -e '....'

vim전체 버퍼를 Perl 스크립트의 출력으로 대체합니다. 중간 단계(새 줄 없음)를 볼 수 없으며 터무니없이 긴 줄을 처리할 필요도 없습니다.

마지막 문에는 s/ \Z/\n공백이 대체되었습니다.파일 끝에서(첫 번째 명령문에 의해 a에서 변환됨 \n) 다시 적절한 텍스트 파일이 되도록(즉, 마지막 줄은 개행 문자로 끝납니다),아니요개행 문자 바로 앞에 있을 수 있는 다른 공백을 변경하십시오. 또는 파일 끝으로 이동하여 수동으로 개행을 추가할 수 있습니다.

더 나은 방법은 에서 vi저장하고 종료한 다음 셸에서 실행하는 것입니다.

perl -i.bak -0 -p -e 's/\n/ /mg; s/ Row/\nRow/mg; s/ \Z/\n/' filename.txt

이렇게 하면 파일이 "제자리"로 수정되고 파일 이름이 "확장자"인 원본 파일의 백업 복사본이 유지됩니다..bak

관련 정보