ブログ・エス技研

当ブログは引越しをしました。10秒後に自動で転送しますが、転送されない場合は、http://blog.s-giken.net/ をご覧ください。
ブログ・エス技研 TOP  >  Linuxコマンド

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --年--月--日 --:-- ] カテゴリ:スポンサー広告 | TB(-) | CM(-)

UNIXのコマンドで特定の文字列を置換する方法

今日は、PHPから離れて UNIX(Linux)のコマンドのお話です。

とはいえ、PHPのプログラムなどのファイルの中にある文字列をまとめて置換したい、という場合の対応方法ですので、全く無関係ではありませんね。

今日は、ファイル内の文字列を一括置換するための UNIXコマンド(Linuxコマンド)です。

文字列置換をする UNIXコマンドは「sed」コマンドで、下記のように記述します。

sed -e 's/置換前対象文字列/置換後文字列/g' 読み取るファイル.txt > 保存.txt


このままでは、元の「読み取るファイル.txt」の文字列を置換し、結果は「保存.txt」に保存します。
そのため、別ファイルを作らずに、置換して上書き保存するには「-i」オプションをつける必要があります。

sed -i -e 's/置換前対象文字列/置換後文字列/g' 読み取るファイル.txt

これで、「読み取るファイル.txt」の中身が置き換えられ、上書きして保存されるます。


もし、置換する際にファイル名は変えずに上書きしたいけども、でも万一の際には元に戻せるようにバックアップを取っておきたい、という場合は、「-i」オプションにファイル名の引数を設定すれば OKです。

sed -i".bak" -e 's/置換前対象文字列/置換後文字列/g' 読み取るファイル.txt

 ※「-i".bak"」の「-i」と「"(ダブルクォーテーション)」の間隔は空けずに詰めて記述します


複数のファイルに対して実行したい場合は、「*.txt」「file_???.txt」のようにワイルドカードも使えます。

sed -i -e 's/置換前対象文字列/置換後文字列/g' *.txt
sed -i".bak" -e 's/置換前対象文字列/置換後文字列/g' *.txt


さらに、置換する文字列を含むファイルだけを指定して置換したい場合は、「grep」とあわせて使う方法があります。
※「grep」の「-l(エル)」オプションは、検索条件にマッチしたファイル名を表示するオプション
※「xargs」は、grepで結果を「sed」に引数として渡すコマンド


grep -l 置換前対象文字列 *.txt | xargs sed -i -e "s/置換前対象文字列/置換後文字列/g"

この方法は、「*.txt」で指定した際にファイル数が膨大な場合や、特定の文字列を含むファイルだけを対象にしたい場合に役に立つでしょう。


ちなみに、サブディレクトリがあるディレクトリ内で「*.txt」のようなワイルドカード指定の「sed」コマンドを実行するとディレクトリ名が影響してエラーが起こるようです。
現時点では、それを回避する方法を確認できていませんので、一度サブディレクトリがないディレクトリに対照ファイルをコピーしてから実行する方がいいでしょう。(万一のコマンドのミスで取り返しが付かない置換処理がされてしまうリスクを避けるためにも有効だと思います。)

※一部、ソース上の「<」「>」などを全角文字で記述しています。


そのほか、perlのコマンドを使って実行する方法もあります。

perl -p -i.bak -e 's/event12/event13/g' event13*
 ※「-i.bak」をつけずに処理をする事は出来ない
  (ファイル保存ではなく、画面表示になるため)

今回の記事を書くために参考にさせていただいたサイトは以下の通りです。こちらも参考にしていただければ、と思います。
http://kazmax.zpp.jp/linux/lin_replace.html
http://what-linux.seesaa.net/article/135110745.html
http://open-groove.net/linux-command/sed-edit-files/
スポンサーサイト
[ 2013年01月10日 17:07 ] カテゴリ:Linuxコマンド | TB(0) | CM(0)
プロフィール

エス技研

Author:エス技研
性別:男性
職業:Web系エンジニア
エンジニアになって 15年ほど経ちますが、その途中で 5年ほどディレクタ、マネジメントを中心とした業務を行っていたためにやや現場を離れていましたが、転職をきっかけに 2012年に現場に復帰し、新たな技術を楽しみながら勉強しています。
メインの環境は LAMP環境です。

FC2ブログランキング
FC2カウンター
FC2拍手ランキング
GoogleAdWords
カレンダー
10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
検索フォーム
ブロとも申請フォーム
QRコード
QR
フリーエリア


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。