複数のテキストファイルがあります。これらすべてのテキストファイルは一連の編集を必要とし、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'