UNIX・Linuxの sedコマンドで特定の文字列を置換する方法
2015/06/15
sedコマンドで文字列置換
今日は、PHPから離れて UNIX(Linux)のコマンドのお話です。
とはいえ、PHPのプログラムなどのファイルの中にある文字列をまとめて置換したい、という場合の対応方法ですので、全く無関係ではありませんね。
今日は、ファイル内の文字列を一括置換するための UNIXコマンド(Linuxコマンド)です。
文字列置換をする UNIXコマンドは「sed」コマンドで、下記のように記述します。
1 |
sed -e 's/置換前対象文字列/置換後文字列/g' 読み取るファイル.txt > 保存.txt |
このままでは、元の「読み取るファイル.txt」の文字列を置換し、結果は「保存.txt」に保存します。
そのため、別ファイルを作らずに、置換して上書き保存するには「-i」オプションをつける必要があります。
1 |
sed -i -e 's/置換前対象文字列/置換後文字列/g' 読み取るファイル.txt |
これで、「読み取るファイル.txt」の中身が置き換えられ、上書きして保存されるます。
もし、置換する際にファイル名は変えずに上書きしたいけども、でも万一の際には元に戻せるようにバックアップを取っておきたい、という場合は、「-i」オプションにファイル名の引数を設定すれば OKです。
1 |
sed -i".bak" -e 's/置換前対象文字列/置換後文字列/g' 読み取るファイル.txt |
※「-i”.bak”」の「-i」と「”(ダブルクォーテーション)」の間隔は空けずに詰めて記述します
複数のファイルに対して実行したい場合は、「*.txt」「file_???.txt」のようにワイルドカードも使えます。
1 2 |
sed -i -e 's/置換前対象文字列/置換後文字列/g' *.txt sed -i".bak" -e 's/置換前対象文字列/置換後文字列/g' *.txt |
sedと grepを組み合わせてさらに便利に文字列置換
さらに、置換する文字列を含むファイルだけを指定して置換したい場合は、「grep」とあわせて使う方法があります。
※「grep」の「-l(エル)」オプションは、検索条件にマッチしたファイル名を表示するオプション
※「xargs」は、grepで結果を「sed」に引数として渡すコマンド
1 |
grep -l 置換前対象文字列 *.txt | xargs sed -i -e "s/置換前対象文字列/置換後文字列/g" |
この方法は、「*.txt」で指定した際にファイル数が膨大な場合や、特定の文字列を含むファイルだけを対象にしたい場合に役に立つでしょう。
ちなみに、サブディレクトリがあるディレクトリ内で「*.txt」のようなワイルドカード指定の「sed」コマンドを実行するとディレクトリ名が影響してエラーが起こるようです。
現時点では、それを回避する方法を確認できていませんので、一度サブディレクトリがないディレクトリに対照ファイルをコピーしてから実行する方がいいでしょう。(万一のコマンドのミスで取り返しが付かない置換処理がされてしまうリスクを避けるためにも有効だと思います。)
※一部、ソース上の「<」「>」などを全角文字で記述しています。
perlコマンドを使っての文字列置換
そのほか、perlのコマンドを使って実行する方法もあります。
1 |
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/
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
Linuxのタイムスタンプはmtime、ctime、atimeの3種類。touchコマンドで更新する方法
Linuxのファイルのタイムスタンプにはmtime、ctime、atimeの3種類がある。その違いを詳細に解説しつつ、lsで表示するオプション、touchで更新するオプションを解説。
-
Linuxのマニュアルページ表示コマンドmanの解説
Linuxにはコマンド操作のオンラインマニュアルが用意されています。そのマニュアルを表示するコマンドが「man」です。「man」コマンドの使い方について解説します。
-
makewhatis、mandbコマンドでLinuxのオンラインマニュアル索引情報を更新
Linuxコマンドのオンラインマニュアルを検索するwhatis、aproposなどのコマンドはwhatisデータベースを対象に検索する。このデータベースを更新するmandb、makewhatisコマンドを解説。
-
Linuxのファイル表示・結合catの逆処理のtac、revコマンドの解説
Linuxにtac、revというコマンドがある。catの逆の処理なのだが、tacは最終行から逆に表示し、revは行末の文字から逆に表示をすることを解説しつつその使い方について詳しく解説をする。
-
less、moreはページャー、ファイルの中身を表示するLinuxのコマンド
Linuxにはコマンドで実行した結果が長い場合、1画面ごとに区切って表示するコマンドが用意されている。それがページャーと呼ばれるmore、lessだ。この使い方を解説。
-
Linuxのコマンドの情報を調べるwhich、whereis、whatis、apropos、man
Linuxのコマンドの実行ファイルやマニュアルの情報を確認するコマンドwhich、whereis、whatis、apropos、manの機能と使い方、似たところと違うところの紹介。
-
Linuxのheadコマンドは先頭行から、tailコマンドは最終行から指定した行を表示する
Linuxのhead、tailコマンドはファイルの先頭の一部、もしくは、末行の一部を表示するコマンド。行数や文字数で指定をする。tailはログを監視するためのオプションがある。
-
Linuxでファイルの内容を表示するcatコマンドの解説。more、lessで代替も
catはLinuxのコマンドで、本来の機能はファイルを連結だが、ファイルの内容を表示する機能のために使うことが多く使用頻度が高い。同種の機能のmore、less、tacコマンドについても解説。
-
Linuxのbashで変数に値を追加する方法を多数紹介。+=や””を使う方法など
Linuxのbashで変数に値を代入する方法を解説。bashの変数の処理は柔軟で様々な方法を採れる。デリミタなしで値を追加する方法などを解説。
-
Linuxのnlは行番号を付与してファイルの内容を表示するコマンド
Linuxでファイルを表示する際に行番号を付与するにはcatコマンドにnオプションを使うことでも可能。しかし、行番号を付与する専門のnlコマンドがある。ここではその使い方を詳細に解説。