여러 개의 텍스트 파일이 있습니다. 이러한 모든 텍스트 파일은 일련의 편집을 거쳐야 하며 vim
이를 자동화하고 싶습니다. vim
몇 가지 교체 명령이 있습니다. 텍스트 파일에 다음 대체 항목이 필요하다고 가정합니다.
- 소년을 소년으로 교체:
%s/boy/Boy/g
- 소녀를 소녀로 교체:
%s/girl/Girl/g
- 빈 줄을 제거합니다:
g/^$/d
이것은 단순한 예일 뿐입니다. 이러한 모든 규칙을 작성한 다음 여러 파일에 대해 자동으로 수행하는 방법이 있습니까?
답변1
예, 이를 자동화하는 방법이 있습니다. 작업에 적합한 도구를 선택하는 것부터 시작됩니다.
이 경우 sed
구부리려고 하는 대신 vi
대화식 사용(자동화 아님)을 위해 설계되었습니다.
의 대체 구문은 sed
기본적으로 의 대체 구문과 동일합니다 vi
.
sed -i.backup 's/boy/Boy/g' file-name-1 file-name-2 ...
답변2
Vim 스크립트(gvim, vim)는 우아하고 쉽게 적용할 수 있습니다.
vi -s edit.vim test.txt
edit.vim에는 다음이 포함됩니다(:wq는 선택 사항).
:%s/boy/Boy/g
:%s/girl/Girl/g
:g/^$/d
:wq
그중 test.txt에는 다음이 포함됩니다.
boys & girls
boys & girls
boy & girl
boys & girls
이것은 "더러운" 텍스트 파일을 정리하기 위한 일반적인 vim 스크립트입니다.
:" clean.vim
:" clean up a text file
:" delete DOS returns (actually superfluous because of non-ASCII
deletion)
:%s/\r//eg
:" delete any non-ASCII including invisibles
:%s/[\x00-\x1f\x80-\xff]/ /eg
:" compress multiple spaces
:%s/\s\s\+/ /eg
:" delete end of line spaces
:%s/\s\+$//e
:" compress multiple blank lines
:v/./,/./-j
:" sort eliminating duplicate lines
:%sort -u
vim에서도 스크립트를 얻을 수 있다는 것을 기억하세요
:source clean.vim
답변3
왜 그것을 사용하지 않습니까 sed
?
sed를 사용하면 디렉토리의 파일을 쉽게 반복할 수 있습니다.
for f in *.txt
do
sed 's/boy/Boy/g;s/girl/Girl/g;/^\s*$/d' $f > tmp
mv tmp $f
done
위의 예에서는 boy->Boy, girl->Girl을 변경하고 빈 줄을 제거합니다.
답변4
인라인 vi
스크립트:
$ vi test.txt -c '%s/boy/Boy/g | %s/girl/Girl/g | g/^$/d | wq'