kazmax - Linux で自宅サーバー

複数ファイル内の文字列を置換して上書き保存する

一発で複数ファイル内の文字列を置換して上書き保存します。一括置換です。

置換ですが、1ファイルとかなら楽なのですが、ファイルが大量にあるとやってられません。find コマンドとperl を組み合わせて使ってます。

Last Update : 2007年04月29日

複数ファイル内の文字列を置換して上書き保存する 項目

  1. 文字列を置換して上書きする
  2. 複数のファイルに対して行う

1. 文字列を置換して上書きする

まず、文字列を置換して同じファイル名で保存するコマンドの説明です。

具体的に例をあげて説明します。
index.htmlの<html><html lang="ja">に置換します。

perlを使ってます。
書式は以下の通りです。

書式

perl -p -i -e 's/検索文字列/置換文字列/g' 対象ファイル名

[hoge@hoge ~]$ head -2 index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>

[hoge@hoge ~]$ perl -p -i -e 's/<html>/<html lang="ja">/g' index.html
[hoge@hoge ~]$ head -2 index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja"> ←変更された事を確認

また、各オプションの意味は以下の通りです。

項目名 意味
-p 入力ファイルから1行づつ取り出して処理し、表示する。
-i ファイルを修正する。拡張子を指定すると、その拡張子でバックアップを取ってくれます。
-e 直後に続く部分をスクリプトとして処理する。
s/検索文字列/置換文字列/g 文字列の置換。検索文字列を置換文字列に置き換える。最後の「 g 」を指定すると、1行に複数検索文字列がある場合、全て置換してくれる。なければ最初の1個だけ置換。

memo

-i 」オプションでバックアップをとりながらの置換の場合、
-i.bak 」の様に続けて書きます。

[hoge@hoge ~]$ ls -l
合計 8
-rw-r--r--  1 hoge hoge 7350  4月 29 00:56 index.html

[hoge@hoge ~]$ head -2 index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>

[hoge@hoge ~]$ perl -p -i.bak -e 's/<html>/<html lang="ja">/g' index.html
[hoge@hoge ~]$ ls -l
合計 16
-rw-r--r--  1 hoge hoge 7360  4月 29 00:57 index.html ← 変更されたファイル
-rw-r--r--  1 hoge hoge 7350  4月 29 00:56 index.html.bak ← バックアップ

[hoge@hoge ~]$ diff index.html index.html.bak ← ファイルを比較
2c2
< <html lang="ja"> ← index.html は変更されている
---
> <html> ← index.html.bak は元のまま

2. 複数のファイルに対して行う

文字列を置換して上書き保存する方法がわかれば、複数のファイルに対して同じ処理を行う事は簡単です。
自分はいつもfind コマンド使ってるので説明もコレで。

書式

find 検索開始ディレクトリ オプション -exec perl -p -i -e 's/検索文字列/置換文字列/g' {} \;
「 \ 」は、「 ¥ 」マークの事です。

→ find についての詳細は find コマンドの説明を見てください。
ここの説明では、通常のファイル全てに対しコマンドを実行します。

$ find . -type f ← コマンドを実行するファイル一覧を確認
./linux/lin_cron.html
./linux/linux1.html
./linux/lin_sshrsa_win.html
./linux/lin_ssh.html
./linux/lin_dist.html
・・・

$ find . -type f -exec perl -p -i -e 's/<html>/<html lang="ja">/g' {} \;

こうすることで、複数ファイル内の文字列を置換して同名ファイルで保存する事ができます。