このページで解説している内容は、以下の 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コマンドのsコマンドを使用して文字列の置換を行う際、デフォルトでは区切り文字としてスラッシュ(/)が使用されます。しかし、置換パターンや置換後の文字列にスラッシュが含まれる場合、エスケープシーケンスを使う必要があり、読みづらくなります。

スラッシュを含む置換

 たとえば、「Cool」を「/Cool/」に置換したい場合、通常は次のようにエスケープシーケンスを使用します。

コマンド例

user01@ubuntu:~$ sed 's/Cool/\/Cool\//g' sample.txt

出力結果

Cl
Col
/Cool/
Coool
/Cool//Cool/
/Cool//Cool//Cool/
/Cool//Cool//Cool//Cool/
Coool!
Cooool!!
Coooool!!!
Japan /Cool/
Japan Hot
America /Cool/
America Hot

解説

  • s/Cool/\/Cool\//g:置換後の文字列である/Cool/のスラッシュを \/ とエスケープしています。
  • エスケープが多く、スクリプトが読みづらくなっています。

区切り文字を変更して簡潔に書く

 sedコマンドでは、sコマンドの後に続く文字が区切り文字として認識されます。そのため、スラッシュ以外の文字を区切り文字として使用することで、エスケープを減らし、スクリプトを読みやすくできます。

区切り文字をコロン(:)に変更した例

user01@ubuntu:~$ sed 's:Cool:/Cool/:g' sample.txt

出力結果

Cl
Col
/Cool/
Coool
/Cool//Cool/
/Cool//Cool//Cool/
/Cool//Cool//Cool//Cool/
Coool!
Cooool!!
Coooool!!!
Japan /Cool/
Japan Hot
America /Cool/
America Hot

解説

  • 区切り文字を:に変更することで、置換後の文字列に含まれるスラッシュをエスケープする必要がなくなりました。
  • s:Cool:/Cool/:gsコマンドの区切り文字を:にしています。

他の区切り文字の例

 区切り文字には任意の文字を使用できます。慣習的によく使用される区切り文字の例を以下に示します。

区切り文字使用例説明
スラッシュ /s/Cool/Hot/gデフォルトの区切り文字
コロン :s:Cool:Hot:gスラッシュを含む場合に便利
バーティカルバー |s|Cool|Hot|gパイプ記号を区切り文字に使用
シャープ #s#Cool#Hot#g見やすさを重視する場合に使用
エクスクラメーション !s!Cool!Hot!g見やすさとタイプのしやすさを重視
他の区切り文字の例

注意点

  • 区切り文字として使用する文字は、置換パターンや置換後の文字列に含まれない文字を選ぶとエスケープが不要になります。
  • 区切り文字を変更することで、スクリプトの可読性と保守性が向上します。

例:区切り文字をエクスクラメーション(!)に変更

user01@ubuntu:~$ sed 's!Cool!/Cool/!g' sample.txt

出力結果

Cl
Col
/Cool/
Coool
/Cool//Cool/
/Cool//Cool//Cool/
/Cool//Cool//Cool//Cool/
Coool!
Cooool!!
Coooool!!!
Japan /Cool/
Japan Hot
America /Cool/
America Hot

解説

  • 区切り文字を!に変更しています。
  • エスケープシーケンスが不要になり、スクリプトがシンプルになります。

不要なファイルを削除

作業が完了したら、サンプルファイルを削除します。

user01@ubuntu:~$ rm sample.txt

まとめ

  • 区切り文字は任意の文字に変更可能であり、置換パターンや置換後の文字列に含まれない文字を選ぶことで、エスケープシーケンスを減らすことができます。
  • スラッシュ(/)以外の区切り文字として、コロン(:)、バーティカルバー(|)、シャープ(#)、エクスクラメーション(!)などがよく使われます。
  • 可読性の向上:区切り文字を適切に選択することで、sedスクリプトの可読性と保守性が向上します。

sedコマンドを活用し、効率的なテキスト処理を実現しましょう。