シェル・スクリプト・リファンレス
コマンド集(機能別) | コマンド集(アルファベット順) | コマンド逆引き大全 | シェル・スクリプト・リファンレス

 文字列を置換する「sed」

 文字列の一部を置き換えたい場合はsedを利用する。sedは文字列を置換したり,特定の行を抜き出したりできる。sedは,


sed -e 条件 対象ファイル
         または
echo $変数名 | sed -e 条件

のように記述する。

 また,置換を行いたい場合は,


sed -e s/置換条件/置き換え条件/ 対象ファイル
         または
echo $変数名 | sed -e s/置換条件/置き換え条件/

のように記述する。たとえば,「.txt」を「.doc」に置換したい場合は,


$ file_name="linux.txt" 
$ echo $file_name | sed -e "s/\.txt/.doc/" 
linux.doc

のようにする。置換条件ではドット(.)は任意の1文字の意味を持ってしまうため,ドット自身を表したい場合は「\.」と記述する。

 また,条件を「s/置換条件/置き換え条件/g」とすると,入力された文字列内すべての置換条件に合致する文字列を置換する。


 正規表現

 sedでは置換する文字列を探す場合に正規表現が利用できる。正規表現とは,「1文字や行末といった条件を記号で表記して複雑なパターンを指定できる,表記方法」である。主な正規表現を表に示す。


正規表現 意味
. 改行文字以外の任意の1文字
* 直前の1文字の0回以上の繰り返しに一致。直前の文字は正規表現でも構わない
^ 行の先頭
$ 行の末尾
[ ] かっこ内の任意の1文字に一致。ハイフン(-)で範囲指定もできる
[^ ] かっこ内の任意の1文字に不一致。ハイフン(-)で範囲指定もできる
\+ 直前の文字の1個以上の繰り返しに一致
\? 直前の文字の0または1文字に一致
\{n\} 直前の文字のn個の繰り返しに一致
\{n,\} 直前の文字のn個以上の繰り返しに一致
\{,m\} 直前の文字のm個以下の繰り返しに一致
\{n,m\} 直前の文字のn個以上,m個以下の繰り返しに一致
パターン1\|パターン2 パターン1またはパターン2のいずれかに一致
\(パターン\) パターンをグループ化する。マッチした内容は\1や\2として利用できる
\ 正規表現に使われる記号を普通の文字として扱う

 たとえば,拡張子部分を取り除きたい場合は,


$ file_name="linux.txt" 
$ echo $file_name | sed -e "s/\.[^.]*$//g" 
linux

とする。「[^.]*」はドットを含まない0文字以上の文字列を表し,「$」は行末を表す。よって,ドット以降の文字列で行末までドットを含まない文字列を置換することになる。


 特定の文字列を抜き出す

 sedの置換では置換条件で「(...)」にくくった文字列を置き換え文字として利用できる。その際,始めに現われた(...)が「\1」,次に現われた(...)が「\2」に代入される。

 たとえば,拡張子部分(ドットより後の文字列)を抜き出したい場合は,


$ file_name="linux.txt" 
$ echo $file_name | sed -e "s/.*\.\([^.]*\)\$/\1/g" 
txt

とする。この場合はドットから末尾までの文字列でその中にドットが入っていない文字列を抜き出し,文字列全体と抜き出した文字列を置換している。