エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


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

      2015/06/15

sedコマンドで文字列置換

 
今日は、PHPから離れて UNIX(Linux)のコマンドのお話です。
 
とはいえ、PHPのプログラムなどのファイルの中にある文字列をまとめて置換したい、という場合の対応方法ですので、全く無関係ではありませんね。
 
今日は、ファイル内の文字列を一括置換するための UNIXコマンド(Linuxコマンド)です。
 
文字列置換をする UNIXコマンドは「sed」コマンドで、下記のように記述します。
 

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

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

 
 ※「-i”.bak”」の「-i」と「”(ダブルクォーテーション)」の間隔は空けずに詰めて記述します
 
 
複数のファイルに対して実行したい場合は、「*.txt」「file_???.txt」のようにワイルドカードも使えます。
 

 
 


 

sedと grepを組み合わせてさらに便利に文字列置換

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

 
この方法は、「*.txt」で指定した際にファイル数が膨大な場合や、特定の文字列を含むファイルだけを対象にしたい場合に役に立つでしょう。
 
 
ちなみに、サブディレクトリがあるディレクトリ内で「*.txt」のようなワイルドカード指定の「sed」コマンドを実行するとディレクトリ名が影響してエラーが起こるようです。
現時点では、それを回避する方法を確認できていませんので、一度サブディレクトリがないディレクトリに対照ファイルをコピーしてから実行する方がいいでしょう。(万一のコマンドのミスで取り返しが付かない置換処理がされてしまうリスクを避けるためにも有効だと思います。)
 
※一部、ソース上の「<」「>」などを全角文字で記述しています。
 
 

perlコマンドを使っての文字列置換

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

 ※「-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/

 - Linuxコマンド

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

Linuxのコマンドの情報を調べるwhich、whereis、whatis、apropos、man
Linuxのコマンドの情報を調べるwhich、whereis、whatis、apropos、man

Linuxのコマンドの実行ファイルやマニュアルの情報を確認するコマンドwhich、whereis、whatis、apropos、manの機能と使い方、似たところと違うところの紹介。

Linuxのheadコマンドは先頭行から、tailコマンドは最終行から指定した行を表示する
Linuxのheadコマンドは先頭行から、tailコマンドは最終行から指定した行を表示する

Linuxのhead、tailコマンドはファイルの先頭の一部、もしくは、末行の一部を表示するコマンド。行数や文字数で指定をする。tailはログを監視するためのオプションがある。

less、moreはページャー、ファイルの中身を表示するLinuxのコマンド
less、moreはページャー、ファイルの中身を表示するLinuxのコマンド

Linuxにはコマンドで実行した結果が長い場合、1画面ごとに区切って表示するコマンドが用意されている。それがページャーと呼ばれるmore、lessだ。この使い方を解説。

cat、less、head、tail、split、sedなどLinuxでファイルを操作するコマンド
cat、less、head、tail、split、sedなどLinuxでファイル、文字列を操作するコマンド

Linuxでファイル、テキストを操作するコマンドのまとめ。cat、less、head、tail、split、tr、sedなど、ファイルを表示、置換、連結、分割などの各コマンドの使い方の紹介と詳細ページの紹介。

Linuxの wcコマンドでファイルの行数、単語数、バイト数、文字数をカウントする
Linuxの wcコマンドでファイルの行数、単語数、バイト数、文字数をカウントする

Linuxの行数、単語数、文字数、バイト数をカウントする「wc」コマンドの使い方の解説。find、lsと組み合わせてファイル数のカウント方法などを解説。

Linuxのタイムスタンプはmtime、ctime、atimeの3種類。touchコマンドで更新する方法
Linuxのタイムスタンプはmtime、ctime、atimeの3種類。touchコマンドで更新する方法

Linuxのファイルのタイムスタンプにはmtime、ctime、atimeの3種類がある。その違いを詳細に解説しつつ、lsで表示するオプション、touchで更新するオプションを解説。

Linuxの環境変数でパスの設定をする方法とシェル変数の扱い方を解説
Linuxの環境変数でパスの設定をする方法とシェル変数の扱い方を解説

Linuxでコマンドを設置するパスの設定情報である環境変数「PATH」の確認方法と環境変数「PATH」に新しいパスを追加する方法の解説。Linuxのシェルでの変数の扱い方についての解説も。

makewhatis、mandbコマンドでLinuxのオンラインマニュアル索引情報を更新
makewhatis、mandbコマンドでLinuxのオンラインマニュアル索引情報を更新

Linuxコマンドのオンラインマニュアルを検索するwhatis、aproposなどのコマンドはwhatisデータベースを対象に検索する。このデータベースを更新するmandb、makewhatisコマンドを解説。

Linux findコマンドを使ってn日前のファイルを削除する 3つの記述方法
Linux findコマンドを使ってn日前のファイルを削除する 3つの記述方法

作成からn日経ったファイルを削除したい、そんなときにはfindコマンドを使う。コマンドの記述の方法は3種類あり、それぞれを解説。書き易さもあるがスピードに大きく差がある記述方法もある。

Linuxのファイル表示・結合catの逆処理のtac、revコマンドの解説
Linuxのファイル表示・結合catの逆処理のtac、revコマンドの解説

Linuxにtac、revというコマンドがある。catの逆の処理なのだが、tacは最終行から逆に表示し、revは行末の文字から逆に表示をすることを解説しつつその使い方について詳しく解説をする。