複数のファイルの複数の文字列を別の文字列に置き換える

複数のファイルの複数の文字列を別の文字列に置き換える

複数のテキストファイルがあります。これらすべてのテキストファイルは一連の編集を必要とし、vimそれを自動化したいと思います。vimいくつかの交換コマンドがあります。テキストファイルに次の代替項目が必要であるとします。

  1. 少年を少年に置き換える:%s/boy/Boy/g
  2. 女の子を女の子に置き換える:%s/girl/Girl/g
  3. 空白行を削除します。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'

関連情報