【コラム】

"Web開発ツールを使いこなせ!"クリエイターの道具箱

14 sedを使った文字列置換

  • >
  • >>

14/14

WebサイトやWebアプリケーションは、一般的に複数のHTML、CSS、JavaScriptファイルから成ります。クラス名やライブラリのファイル名を毎回手動で探して修正するのと、ツールを使って一括で修正するのでは作業効率が大きく変わってきます。今回は、文字列の置換に特化したコマンド - sedをご紹介します。

sedとは

sed(Stream EDitor)とは、UNIX系のOSに付属するコマンドの1つです。テキストファイルや標準入力から1行ずつ読み込み、指定したパターンに従ってさまざまな処理をおこないます。さまざまなオプションや機能が用意されており、ちょっとした文字列の置換から高度な編集まで幅広く活用できます。

sedには「スクリプト」と呼ばれる考え方があります。処理したい内容をスクリプトとして記述し、sedに渡すことで「文字列の置換」や「行の削除」をおこなえます。第12回目で取りあげたgrepと同様、正規表現を用いることで、さまざまなパターンに適応する文字列の置換も可能です。

sedコマンドは文字列置換によく利用されますが、文字列置換以外にもさまざまな処理ができます。今回は、sedの使い方についてご紹介します。

Windows向けsed(GnuWin sed)のインストール

ここでは第13回同様、GnuWinプロジェクトのsedを使用します。

GnuWinのgrep

GnuWinのsedページにアクセスし、Complete package, except sourcesからインストーラ(Md5sum: d9cc0ee232603c1a0f8280fa2e6c100b)をダウンロードし、インストールをおこないます。

インストーラはウィザード形式

インストール先ディレクトリのカスタマイズをおこなわず、インストールをおこないます。sedをインストール後、環境変数PATHの設定をおこないます。PATHに設定するパスは、第13回「grepを使った文字列検索」と同様です。既に追加されている場合は、変更の必要はありません。

変数名 PATH
変数値 C:\Program Files\GnuWin32\bin

環境変数PATHを設定後、コマンドプロンプト上でsedコマンドを実行してみましょう。

Mac OS Xでsedを使用する

Mac OS Xでは、最初からsedがインストールされています。Mac OS Xには、GNU版のsedとBSD版のsedがインストールされています。それぞれ指定できるオプションが異なっているため、混同しないように注意しましょう。

GNU版のsedを用いる場合は、ターミナル上でgsedコマンドを実行します。

GNU版のsed(gsed)

BSD版のsedを用いる場合は、ターミナル上でsedコマンドを実行します。BSD版sedの詳しい使い方を参照するには、manコマンドを使用します。

man sedを実行し、BSD版のsedのマニュアルを表示

ここではWindowsにインストールしたsedに合わせて、GNU版sedの使い方をご紹介します。

sedの使い方

sedの書式は、次のようになっています。

sed オプション スクリプト 検索対象のファイル

まずはオプションを指定せず、sedで簡単な文字列の置換をおこなってみましょう。Webサイトで使用しているjQueryライブラリのアップデートのため、jQueryライブラリをロードしているHTMLの\タグを修正する、と仮定します。テスト用に次のテキストファイルを用意します。

ファイル名: load_jquery_js

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<link type="text/css" rel="stylesheet" href="/common/css/common.css" media="all" />
<link type="text/css" rel="stylesheet" href="/common/css/second.css" media="all" />
<link type="text/css" rel="stylesheet" href="/common/css/print.css" media="print" />
<link type="text/css" rel="stylesheet" href="css/contents.css" media="all" />

<script type="text/javascript" src="/common/js/jquery-1.7.1.min.js"></script>
<!--<script type="text/javascript" src="/common/js/jquery.min.js"></script>-->
<script type="text/javascript" src="/common/js/jquery.rollover.js"></script>
<script type="text/javascript" src="/common/js/jquery.scroller.js"></script>
<!--<script type="text/javascript" src="/common/js/scrollsmoothly.js"></script>-->
<script type="text/javascript" src="/common/js/common.js"></script>
<script type="text/javascript" src="/common/js/second.js"></script>
<script type="text/javascript" src="/common/js/randomA.js"></script>
<script type="text/javascript" src="/common/js/randomB.js"></script>

load_jquery_jsファイル内の9行目「jquery-1.7.1.min.js」を、sedで「jquery-2.0.3.min.js」に置きかえてみましょう。次のコマンドを実行します。

sed "9s/jquery-1.7.1.min.js/jquery-2.0.3.min.js/" load_jquery_js

sedコマンドの実行結果。赤線部のファイル名がスクリプト通りに置換されている

sedコマンドを実行すると、赤線部で表示した箇所のファイル名が置換されていることがわかります。sedでおこなわれていることと、スクリプトで渡している内容について確認してみましょう。

sedでは、次の手順で処理がおこなわれます。

1.ファイルから1行を読み込み、一時的な記憶領域(パターンスペース)に保存する
2.パターンスペースに保存されている文字列を、オプションやスクリプトに従って処理をおこなう
3.パターンスペースに残った文字列を画面に出力し、パターンスペースを空にする

sedは最後の行が処理されるまで、これらの処理を繰り返し順番におこないます。

sedのスクリプトでは、おもに「どの行で」「何をするか」を指定します。このうち、行を指定する部分をアドレスと呼び、「何をするか」はコマンドを記述して処理を進めることになります。さきほどのコマンドサンプルのうち、スクリプト部分について見てみましょう。

"9s/jquery-1.7.1.min.js/jquery-2.0.3.min.js/"

アドレスは行番号で指定します。最初の「9」は、9行目を指しています。続く「s」は、置換コマンドです。スラッシュ(/)に続けて、置換前の文字列と置換語の文字列を/で区切って指定します。上記のスクリプトの場合「9行目の、最初に出てくる"jquery-1.7.1.min.js"を"jquery-2.0.3.min.js"に置換せよ」という意味合いになります。スラッシュを置換したい場合は、スラッシュの前にバッククォート()を入力します。

sコマンドでは、アドレス部分を省略できます。アドレスを指定しなかった場合は、すべての行に対して処理がおこなわれます。次のコマンドでは、load_jquery_jsファイル内の「/common」をすべて取り除きます。

sed "s/\/common//" load_jquery_js

sedコマンドでファイルを直接編集し、typeコマンドでファイルの中身を表示。ファイル内が書き換わっていることがわかる

sコマンドは、一番最後のスラッシュに続けてオプションを追加できます。オプションを追加しない場合、指定した検索パターンが最初に出てきた箇所のみが置換されます。gオプションを指定した場合は、行内でマッチしたすべての文字列が置換されます。数字を指定した場合は、指定した検索パターンが数字で指定した場所でのみ置換がおこなわれます。たとえば2と指定した場合は、パターンが2番目にマッチした場所でのみ置換されます。 gオプションを指定した場合と、そうでない場合の動作を比較してみましょう。

sed "s/script/SCRIPT/" load_jquery_js
sed "s/script/SCRIPT/g" load_jquery_js

gオプションを指定しないで置換した場合と、指定した場合とでの置換結果の比較。オプションを指定しない場合は、最初にscriptが出現した箇所のみ置換がおこなわれている。gオプションを指定した場合は、すべてのscriptが置換されている

sedでは置換をおこなうsコマンドのほか、削除をおこなうdコマンドが用意されています。次のコマンドでは、load_jquery_jsファイル内の「script」が含まれる行をすべて削除します。

sed "/script/d" load_jquery_js

dコマンドの前にエクスクラメーション(!)を指定することで、逆の動作を指定できます。次のコマンドでは、load_jquery_jsファイル内の「script」が含まれない行をすべて削除します。

sed "/script/!d" load_jquery_js

sedではファイルを指定して処理をおこなうほか、標準入力からの読み込みも受け付けます。たとえば第13回で紹介したgrepコマンドとパイプを組み合わせることで次のようなことを実現できます。

■Webサイトを構成する複数のHTML/CSS/JavaScriptファイルから、特定の文字列を一括置換

・使用しているライブラリ、フレームワークのバージョンアップ時
・ライブラリのバージョンアップ時に非推奨となったコードの検索・置換
・ファイル名やディレクトリ名の変更時
・複数ファイルにまたがるタイプミス、スペルミス

■アクセスログから特定のアドレスやリファラ、UserAgentのみを抽出し、フォーマットを加工して別ファイルに保存

・特定ページへのアクセス数集計
・アクセスログの統計

■複数のCSVファイルから、必要なデータのみを抽出し、フォーマットを加工して別ファイルに保存

・Webアプリで使用するデータベースに、テストで使用するデータを生成
・別のデータベースから抽出したデータから、必要なデータのみを抽出し、ほかのデータとして利用

大量のファイルからなるWebサイトやWebアプリケーションを管理している場合、複数ファイルを横断しての検索・一括置換を自在にできることで作業を大幅に省力化できます。また、これらのコマンドは1つの機能に特化しています。シンプルな機能を持つコマンド同士を組み合わせることで、HTMLやCSSの編集のみならず、ログファイルやCSVデータといったテキストファイルから必要な情報だけを抽出することも可能になります。

次回はgrepコマンドとsedコマンド、xargsコマンドとパイプを組みあわせて、Webサイトの編集にありがちな「複数ファイルの横断検索、一括置換」の方法をご紹介します。

富田宏昭 Hiroaki Tomida
「株式会社キクミミ」でFileMakerやオープンソース言語などを用いた、Webアプリ開発 企業の業務改善のためのシステム開発や環境構築を行っている。主な著書に「HTML5/JavaScriptとPhoneGapで作るiPhoneアプリ開発入門」(マイナビ)など。
  • >
  • >>

14/14

インデックス

連載目次
第14回 sedを使った文字列置換
第13回 grepを使った文字列検索
第12回 Selenium WebDriverを使ったテストの自動化
第11回 さまざまなWebブラウザと開発者向けデバッグツール
第10回 RedmineとSubversionを連携したソフトウェア開発管理
第9回 Subversionによるバージョン管理(2)
第8回 Subversionによるバージョン管理(1)
第7回 Redmineによるプロジェクト管理
第6回 期待のWeb開発特化軽量エディタ、Adobe Brackets
第5回 NetBeans 7.3を使ったWeb開発
第4回 Web開発に特化した開発環境/エディタたち
第3回 オープンソースライブラリの選定方法
第2回 スマートフォン/タブレット向けWebサイト構築TIPS(2)
第1回 スマートフォン/タブレット向けWebサイト構築TIPS(1)

もっと見る



人気記事

一覧

イチオシ記事

新着記事