はじめに
sedはテキスト処理に欠かせないコマンドですが、「区切り文字」の理解でつまずく初学者は少なくありません。特にパスのように「/」が多い文字列では、エスケープが増えて読みにくくなる問題があります。
普段は「/」を使うことが多いですが、実は自由に変更できます。sコマンドの直後の1文字目が区切り文字として認識され、/ 以外に |, #, @, ; などがよく使われます
この記事では、区切り文字の仕組みと使い分けを初心者目線で丁寧に解説します。
参考元:GNU sed
sedと区切り文字で理解する置換コマンドの仕組み
今回使用するコマンドは以下です。
このコマンドの役割は「/ を _ にすべて置換する」です。
仕組み
| 要素 | 内容 |
|---|---|
| s | 置換コマンド |
| | | 区切り文字 |
| / | 置換対象 |
| _ | 置換後 |
| g | 行内すべて置換 |
sコマンドの直後の文字(改行やバックスラッシュ以外)なら、実質的にどの文字でも区切り文字として使えます
実行前の状態
ファイル名:input.txt
/etc/nginx/conf.d
実行後の状態
ファイル名:input.txt
_etc_nginx_conf.d
実行画像

|と/のコードの比較
| 区切り文字 | コード | 特徴 |
|---|---|---|
| / | sed 's/\//_/g' input.txt | /をエスケープする必要あり |
| | | sed 's|/|_|g' input.txt | /をエスケープする必要無し |
メリットとして、エスケープ(\)を減らすことで、正規表現のミスを物理的に防げる点が重要です
/以外の区切り文字を使う方法
| 区切り文字 | コード例 | 特徴 |
|---|---|---|
| # | sed 's#/#_#g' input.txt | URLに便利 |
| @ | sed 's@/@_@g' input.txt | 視認性が高い |
| ; | sed 's;/;_;g' input.txt | シンプル |
変更しない方が良いケース
- 一般的なサンプルコードと合わせたい場合
- 他人と共有するスクリプト
- 単純な置換でエスケープが少ない場合
このような場面では、標準的な「/」を使う方が理解しやすいです
区切り文字の逆引き
| 用途 | 推奨区切り文字 | 理由 |
|---|---|---|
| ファイルパス | | | /と衝突しない |
| URL | # | http://と衝突しない |
| 複雑な正規表現 | @ | 視認性が良い |
具体的な利用シーン
ファイル名:input.txt
/etc/nginx/conf.d
コマンド
解説
パス区切りの「/」を「_」に変換し、ログ用や変数用の安全な文字列に加工しています。区切り文字に「|」を使うことで、パスの「/」と衝突せず、エスケープ不要で処理できます。
区切り文字が含まれていたら
エラー例
これは「置換後」が空かつ区切りが連続するため、意図しない解釈になりやすいです
改善例
この場合、「/」を「|」に置換します。バックスラッシュでエスケープすることで、区切り文字そのものを文字として扱えます
シェル変数の使用
仕組み
- ダブルクォートを使うことでシェル変数が展開されます
- $TEST の値に置換される
例:
→ / が - に変換されます
失敗例
1つ目
→ 区切りが不足して構文エラーになります
2つ目
→ gがないため最初の1箇所しか置換されません
3つ目
→ 置換対象が未指定でエラーになります
まとめ
sedの区切り文字を理解すると、可読性と安全性が大きく向上します。特にパスやURLを扱う場面では、適切な区切り文字の選択が重要です
