このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:sedコマンドでの拡張正規表現

sedコマンドでの拡張正規表現

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

sedコマンドの概要

 sedStream 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コマンドを使いこなすことで、テキスト処理の効率を大幅に向上させることができます。拡張正規表現や後方参照、アドレス指定などの機能を活用し、複雑なテキスト編集もシンプルに実現しましょう。