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
Raspberry Pi2でHDMIからmp3の音を出す@Ubuntu 14.04

Raspberry Pi2 にUbuntuをインストールして、コマンドラインから …

no image
ソースコードを読むためのツール

CodeReadingWikiを改造してみました  →  こちら 現在多くのアプ …

no image
mosh(クライアント)のインストール@cygwin

mosh (mobile shell) は、NWが不安定で接続が切れたり、IP …

no image
Firefox検索フォームに検索履歴ボタンを追加する@Firefox 3.0

Firefox の検索欄は、検索履歴を覚えてくれ、↓を押すと履歴が出てきます。し …

no image
iptablesの操作@Fedora 17

iptables を起動時に自動起動するようにする # system enabl …

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

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

Windows10にssh-agentをインストール

WindowsのPowerShell向けのssh-agentをインストールしてみ …

no image
ハードディスクへのアクセスが異常に遅い@Windows XP

Windowsの動作が異常に遅いPCがあって、調査していたらHDDへのアクセスが …

no image
ログアウトしてもプロセスを止めないようにする@bash

bash上で何かプログラムを走らせている時に、ログアウトしてもプロセスを動かし続 …

no image
IPアドレスの範囲からサブネットマスクを簡単に計算する@CentOS 5

ちょっとしたアタックがあるIPからあった場合に、whois で IP の情報調べ …