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