はじめに
sedはテキスト処理を効率化できる強力なコマンドですが、「エスケープ」が原因で思った通りに動かないことが非常に多いです。特に記号の扱いは初学者が最初につまずくポイントです。
この記事では、実際に記号を検証しながら、sedにおけるエスケープの考え方を理解できるように解説します。単なる暗記ではなく、「なぜ必要なのか」まで理解することで応用力が身につきます。
参考: GNU sed
sedとエスケープを理解する置換コマンドの仕組み
今回使用するコマンドは以下です。
このコマンドの動きを分解すると以下の通りです。
| 要素 | 内容 |
|---|---|
| s | 置換コマンド(substitute) |
| / | 区切り文字 |
| \/ | 「/」で検索(エスケープしている) |
| hello | 置換後の文字列 |
sedでは「/」が区切り文字として使われるため、そのままでは検索対象として扱えません。そのため\でエスケープしています。
実行前の状態
まずはファイルを作成します。
cat << 'EOF' > input.txt
.,*[]()!"#$%-=~^|@`{;+:*}<>?_&\/'
EOF
input.txtの内容は以下です。
.,*[]()!"#$%-=~^|@`{;+:*}<>?_&\/'
実行後の状態
コマンドを実行します。
input.txtの内容(出力結果)は以下になります。
.,*[]()!"#$%-=~^|@`{;+:*}<>?_&\hello'
「/」が「hello」に置換されていることが確認できます。
実行画像

検索パターンでエスケープが必要な記号
sedの検索パターンでは、正規表現として特別な意味を持つ記号があります。そのため、文字として扱うにはエスケープが必要です。
| 記号 | コマンド例 | 意味 |
|---|---|---|
| . | sed 's/\./X/' | 任意の1文字 |
| * | sed 's/\*/X/' | 直前の繰り返し |
| $ | sed 's/\$/X/' | 行末 |
| ^ | sed 's/\^/X/' | 行頭 |
| [ | sed 's/\[/X/' | 文字クラス開始 |
| ] | sed 's/\]/X/' | 文字クラス終了 |
| \ | sed 's/\\/X/' | エスケープ文字 |
| / | sed 's/\//X/' | 区切り文字 |
これらは「特別な意味を持つ」ため、そのまま使うと意図しない動作になります。
'(シングルクオート)で囲む理由
以下のコマンドを見てください。
シングルクオートで囲むことで、$testは「そのまま文字列」として扱われます。
一方、ダブルクオートの場合:
これはシェルによって$testが変数展開されます。つまり、意図せず値が変わる可能性があります。
そのため、sedでは基本的にシングルクオートを使うのが安全です。
'(シングルクオート)を指定したい場合
シングルクオート自体を扱うには、以下のように書きます。
これは以下のように分解できます。
- ' → 文字列終了
- \' → エスケープされたシングルクオート
- ' → 再び文字列開始
このように「一度閉じてからエスケープする」のがポイントです。
BREとEREの違い
sedはデフォルトでBRE(基本正規表現)を使用します。
| 記号 | BRE | ERE |
|---|---|---|
| () | エスケープ必要 \(\) | そのまま使用 |
| {} | エスケープ必要 \{\} | そのまま使用 |
| + | エスケープ必要 \+ | そのまま使用 |
| ? | エスケープ必要 \? | そのまま使用 |
EREを使う場合は-Eオプションを付けます。
挙動比較コード:
置換後でエスケープが必要な記号
まずファイルを作成します。
cat << 'EOF' > input.txt
X
EOF
置換後では以下の記号に注意が必要です。
| 記号 | コマンド例 |
|---|---|
| & | sed 's/X/\&/' |
| \ | sed 's/X/\\/' |
| / | sed 's/X/\//' |
使用例
→ 「&」は「マッチした文字列」を意味するため、エスケープが必要です。
区切り文字の変更
sedでは「/」以外も区切り文字に使えます。
パスなど「/」が多い場合は、区切り文字を変更する方が可読性が上がります。実務でも推奨されるケースが多いです。
詳しくはこちらのsedの区切り文字を自由自在に変える方法|/以外の書き方と実践テクニックで解説していますので、ぜひそちらも確認してください。
逆引き
よくある操作をコマンドから逆引きで紹介します。
例1:/を置換
cat << 'EOF' > input.txt
a/b/c
EOF
例2:行末の$を置換
cat << 'EOF' > input.txt
test$
EOF
例3:ドットを置換
cat << 'EOF' > input.txt
a.b.c
EOF
失敗例
1:エスケープ忘れ
sed 's/./X/'
→ 全文字が対象になる
2:ダブルクオート使用
sed "s/hello/$test/"
→ 変数展開される
3:区切り文字の衝突
sed 's//home/user//tmp/'
→ エラーになる
sedとエスケープを理解して安全に使いこなすためのまとめ
sedで重要なのは「どの記号が特別な意味を持つか」を理解することです。エスケープは単なる記号のルールではなく、「正規表現の文法」を正しく扱うための手段です。
特に以下を押さえておくと実務でも困りません。
- 検索パターンでは正規表現の記号に注意
- 置換後では「&」と「\」に注意
- シングルクオートで囲むのが基本
- 区切り文字は柔軟に変更可能
これらを理解すれば、sedとエスケープの扱いに自信が持てるようになります。
