Mazn.net

やってみて 調べてみて 苦労しなけりゃ 箱は動かじ

シェルスクリプトでファイル内の文字列を置換する

      2013/07/15

== 2012/11/8 追記 ==

以下ではedコマンドでの文字列置換を紹介していますが、sed に -i オプションをつけると、ファイル内の文字を置換できるようです。

あるファイルをsedやtrで文字列置換したあと、同じファイルにリダイレクトすると空になってしまいますよね。そこでテンポラリファイルなどにリダイレクトした後に、mvするという方法がまず考えられますが、その分やることが増えて面倒です。

そこでedというラインエディタを使うと、ファイル内の文字列をコマンドラインで置換することができます。ラインエディタとはviやemacsといったエディタみたいなものですが、行単位でテキストを編集するためにこのように呼ばれます。それに対してviやemacsはスクリーンエディタと呼びます。

ちなみに、viやvimで文字列を置換する場合(hogehogeをaaaaaにする場合)

:%s/hogehoge/aaaaa/g

といったコマンドを使いますよね。これが実はedのコマンドexコマンドと呼び、edのコマンド由来であるため、viのexコマンドを使える人はedもすぐに使えます。

よって、シェルスクリプトで置換するには、以下のようにすると置換できます。

$ echo -e "%s/hogehoge/aaaaa/g\\nw" | ed - ファイル名

ここでおや?って思った人もいると思います。コマンドの最後に\nwがあります。”w”はviで変更を保存するときと同じで、edもあくまでエディタなので、この保存コマンドが必要になります。”\n”は改行です。edは1行に1コマンドなので、置換するコマンドと保存するコマンドをこの改行で区別しています。echo に -eがあるのはこの改行文字列をechoで扱えるようにするためです。edの”-“は通常の端末メッセージを表示しないようにするオプションです。

上記ではechoでコマンドを作っていますが、リダイレクト”<“でコマンドの書かれたファイルを読み込んで実行することも可能です。

$ ed - ファイル名 < コマンドの書かれたファイル

また、ヒアドキュメントを使って以下のようにすることも可能です。

$ ed - << END
%s/hogehoge/aaaaa/g
w
END

hogehogeにマッチする行を削除するには、以下のようにすればOKです。これもviのコマンドと一緒ですね。

$ echo -e "g/hogehoge/d\\nw" | ed - ファイル名

なお、シェルスクリプトでこのような処理を行う場合、”\”や”$”などがシェルで解釈されてしまうので、エスケープが必要になります。

(例)

$ echo -e "g/\\$aaaaa/d\\nw"
g/$aaaaa/d
w

$ echo -e "g/\\\\\\\\1aaaaa/d\\nw"
g/\\1aaaaa/d
w

 - IT技術, プログラミング ,

336px

Message

メールアドレスが公開されることはありません。

  関連記事

no image
Linuxで汎用マウスジェスチャ@Fedora 14 with KDE

Windows では strokeit という汎用のマウスジェスチャをずっと使っ …

no image
Sakura VPS使ってみた&真っ先にやったこと@CentOS 5

Sakura VPS を使ってみました。契約完了後、30分程度で設定完了のメール …

no image
sshダイナミックフォワーディング@cygwin

OpenSSHクライアントのsshコマンドでトンネリングをする方法として-Lオプ …

no image
シェルスクリプト内のコマンドのエラー出力をファイルに一括リダイレクト

通常、シェルスクリプトのエラー出力をファイルに保存したい場合、以下のように、「コ …

no image
Cygwinでscreenコマンドが使えなくなる@Windows 10

Windows 10 上のCygwin (64bit版使用)で、screen コ …

no image
LXDEのスタートメニューのカスタマイズ@Ubuntu 14.04

menulibreというツールがあるので、これをリポジトリに追加してインストール …

no image
セキュアなWPA-PSK + インフラストラクチャモードでテザリング@Galaxy S with root

Wifiでテザリングするために、Android で root とって、Wirel …

no image
国別 IP アドレス割り当てリスト

サーバを立てているとあちこちから不正アクセスがくるもので、特に不正アクセスが多い …

no image
Galaxy SIIIのカメラのシャッター音を消す@Android 4.1.2

root 化した端末必須です。 root 権限で実行でき、/system を読み …

no image
JavascriptエンジンRhinoを入れてみる@WindowsXP

Ajaxの実装や、OpenOfficeなどのマクロ用、ThunderbirdやF …