このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
Linuxコマンドの基本:sedコマンドでの拡張正規表現

sedコマンドでの拡張正規表現
sed
コマンドは、テキスト処理において強力なツールであり、正規表現を使用して複雑な置換や編集を行うことができます。ここでは、sed
コマンドでの拡張正規表現の利用方法について解説します。

sedコマンドの概要
sed
(Stream Editor)は、非対話型のストリームエディタであり、テキストデータを一括で処理することができます。sed
コマンドを使用すると、ファイルを直接編集することなく、指定した編集操作の結果を標準出力に表示できます。
【書式】sed [オプション] '<スクリプト>' <対象ファイル>
[オプション]
:コマンドの動作を変更するためのオプション。'<スクリプト>'
:実行する編集コマンド。シングルクォートで囲みます。<対象ファイル>
:編集対象のファイル名。
サンプルファイルの作成
まず、sed
コマンドの動作を確認するためのサンプルファイルを作成します。
user01@ubuntu:~$ nano sample.txt
sample.txt
の内容
Cl
Col
Cool
Coool
CoolCool
CoolCoolCool
CoolCoolCoolCool
Coool!
Cooool!!
Coooool!!!
Japan Cool
Japan Hot
America Cool
America Hot
sedでの拡張正規表現
sed
では、正規表現はデフォルトで基本正規表現として解釈されます。拡張正規表現を利用したい場合は、-r
オプションを付けます。
拡張正規表現の利用方法
次の例では、拡張正規表現のCo+l
を利用して、「C」の後に「o」が1回以上続き、その後に「l」が続くパターンを「Hot」に置換しています。
コマンド例
user01@ubuntu:~$ sed -r 's/Co+l/Hot/' sample.txt
出力結果
Cl
Hot
Hot
Hot
HotCool
HotCoolCool
HotCoolCoolCool
Hot!
Hot!!
Hot!!!
Japan Hot
Japan Hot
America Hot
America Hot
基本正規表現での記述
Linuxのsed
(GNU sed)では、独自拡張により、拡張正規表現の+
や?
を \+ や \? のようにエスケープして書くことで、基本正規表現として利用できます。つまり、以下の2つのコマンドは同じ意味になります。
拡張正規表現で記述
$ sed -r 's/Co+l/Hot/' sample.txt
$ sed -r 's/Co+l/Hot/' sample.txt
基本正規表現で記述
$ sed 's/Co\+l/Hot/' sample.txt
$ sed 's/Co\+l/Hot/' sample.txt
ポイント
+
や?
を使用する際、基本正規表現ではエスケープが必要です。- 現在のLinux環境(GNU sed)では、どちらの正規表現も利用可能です。
- 歴史的な理由から、長年Linuxを利用しているユーザーは基本正規表現を好む傾向があります。
後方参照
正規表現を用いて置換を行う際、マッチした部分を置換後の文字列に埋め込みたい場合があります。そのような場合には、後方参照を利用します。
後方参照の基本
後方参照とは、正規表現で()
(または \(\) )でグループ化した部分を、置換後の文字列で \1 、\2 などの形で参照する機能です。
基本正規表現と拡張正規表現での後方参照の違い
正規表現の種類 | グループ化の方法 | 後方参照の方法 |
---|---|---|
基本正規表現 | \( \) | \1 |
拡張正規表現 | ( ) | \1 |
例:後方参照を使った置換
次の例では、「Japan 任意の文字列」の部分をグループ化し、後方参照を使って置換しています。
コマンド例
user01@ubuntu:~$ sed 's/Japan \(.*\)/---\1---/' sample.txt
出力結果
Cl
Col
Cool
Coool
CoolCool
CoolCoolCool
CoolCoolCoolCool
Coool!
Cooool!!
Coooool!!!
---Cool---
---Hot---
America Cool
America Hot
解説
s/Japan \(.*\)/---
\1---
/
- Japan \(.*\):
Japan
に続く任意の文字列をグループ化。 - \1:グループ化した部分を参照。
- 置換後の文字列は
---
と\1と---
を組み合わせたもの。
複数のグループ化
複数のグループを作成した場合、それぞれを \1、\2、\3 のように順番に参照できます。
アドレス指定
sed
コマンドでは、d
コマンドやp
コマンドと同様に、置換操作でもアドレス指定が可能です。これにより、特定の行範囲やパターンに一致する行だけを置換対象とすることができます。
例:特定の行範囲での置換
次の例では、5行目から8行目までの行に対して、「Cool」を「Hot」に置換しています。
コマンド例
user01@ubuntu:~$ sed '5,8s/Cool/Hot/g' sample.txt
出力結果
Cl
Col
Cool
Coool
HotHot
HotHotHot
HotHotHotHot
Coool!
Cooool!!
Coooool!!!
Japan Cool
Japan Hot
America Cool
America Hot
解説
5,8s/Cool/Hot/g
5,8
:5行目から8行目までを指定。s/Cool/Hot/g
:行内のすべての「Cool」を「Hot」に置換。
不要なファイルの削除
作業が完了したら、サンプルファイルを削除します。
user01@ubuntu:~$ rm sample.txt
まとめ
- 拡張正規表現の利用:
sed
コマンドで拡張正規表現を使用するには、-r
オプションを付けます。 - 基本正規表現での拡張記法:GNU
sed
では、\+ や \? を使うことで基本正規表現でも拡張記法が利用できます。 - 後方参照:グループ化した部分を \1、\2 で参照し、置換後の文字列に埋め込むことができます。
- アドレス指定:特定の行や範囲を指定して、置換操作を限定することができます。
sed
コマンドを使いこなすことで、テキスト処理の効率を大幅に向上させることができます。拡張正規表現や後方参照、アドレス指定などの機能を活用し、複雑なテキスト編集もシンプルに実現しましょう。