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
py2exeでpythonをWindowsの実行ファイル形式にする@Windows 7 64bit

python でちょこっと作プログラムを誰かに渡したいとき、相手にpython入 …

no image
LDAPサーバ構築 その2 – Sambaサーバとの連携 @ Debian etch

LDAP+SambaでPDCを構築する方法です。 # apt-get insta …

no image
SVNのシンボリックリンク?

SVNでソースを管理している時、ある他のリポジトリで管理されているライブラリを参 …

no image
rubyの文字コードについて考える

rubyでは、1.6以降漢字コードを特別に解釈しなくなったようです。 maznは …

no image
ディスクイメージをデバイスファイルとして扱う@CentOS5.4 + Xen

※ 2015/4/30追記 : mountオプションで直接マウントする方法を書き …

no image
proxy.pacのデバッグ@Firefox

プロキシ環境では、プロキシ設定を自動化するためにproxy.pacなるものがよく …

no image
Flashのインストール@Fedora 17

LinuxにFlashインストールするのも随分楽になりました。 今ではAdobe …

no image
CentOS 7からWindowsにリモートデスクトップ接続で変換キーや無変換キーを使う

CentOS 7にデフォルトで同梱されているリモートデスクトップクライアント(f …

no image
WordPressのページ管理画面でページ番号を出力する

WordPressのページ機能で静的なページを作成しているとき、ページの順序を変 …

no image
ローカルファイルの読み取り@Javascript with Rhino

Rhinoを使ったJavascriptスクリプトでファイルを読み込むにはread …