はじめに
Linuxで sed を使って文字列を置換や抽出をしようとしたとき、以下のようなエラーに遭遇することがあります。
sed: -e expression #1, char 1: unknown command
このエラーは「sedに与えた式(expression)が正しく解釈できなかった」ことを意味します。
一見すると難しそうですが、原因は オプションや区切り文字の誤り、正規表現のエスケープ不足 であることが大半です。
この記事では、よくある原因とその解決方法を整理して解説します。
エラーの意味を理解しよう
エラーメッセージを分解すると以下の通りです。
- -e expression #1 → 最初の
-eオプション(または最初のスクリプト)で問題がある - char 1: unknown command → 式の1文字目が、
sedが認識できないコマンドだった
つまり、sedが「最初のコマンド文字を理解できない」状態になっています。
ではなぜそのようなことが起きるのか、具体的に見ていきましょう。
原因と解決策
1. オプションや書式の誤り
なぜ起きる?
sed は基本的に「アドレス + コマンド + 引数」という形式でコマンドを解釈します。
例えば置換は以下のような形です。
sed 's/pattern/replacement/' file
このとき、書式を間違えると最初の文字がコマンドではなくなり、unknown command となります。
例
sed '/pattern/replacement/' file
s が抜けているため、最初の文字 / を「未知のコマンド」と判断されます。
解決方法
- 置換の場合は必ず
sを書く - オプションや構文を公式の書式に沿って書く
2. 区切り文字の誤り
なぜ起きる?
s コマンドでは通常 / を区切り文字として使いますが、
誤って別の文字で開始してしまうと最初の文字が「未知のコマンド」と解釈されます。
例
sed 's|pattern/replacement|' file
意図的に / の代わりに | を使うことは可能ですが、閉じの区切りを忘れるとエラーになります。
解決方法
- 区切り文字を使う場合は開始と終了を揃える
/を含むパスやURLを扱う場合は、むしろ|や#を使うと便利
# URL置換の例(/が多いので区切りは|を利用)
sed 's|http://example.com|https://newsite.com|' file
3. 正規表現のエスケープ不足
なぜ起きる?
正規表現の中で \, /, & などは特別な意味を持ちます。
これをそのまま使うと、sedが式を途中で切ってしまい、結果的に「最初のコマンド文字が変」→unknown command になります。
例
sed 's/1+1=2/true/' file
+ が正規表現の量指定子として解釈され、意図しない形になります。
解決方法
- 特殊文字は
\でエスケープする
sed 's/1\+1=2/true/' file
- Bashの変数展開と組み合わせる場合は、ダブルクォートの扱いにも注意
pattern="foo/bar"
sed "s|$pattern|baz|"
なぜこれで直るのか?
sedは正規表現を逐一解釈するため、特殊文字をエスケープすることで「ただの文字」として処理させることができるからです。
よくある間違いまとめ
sを忘れて/pattern/replace/のように書いてしまう- 区切り文字を開始と終了で揃え忘れる
- 正規表現の特殊文字をエスケープしない
この3つを意識すれば、sed: -e expression #1, char 1: unknown command エラーはほとんど回避できます。
まとめ
unknown commandは「最初のコマンド文字を解釈できない」ことを意味する- 主な原因は 書式ミス / 区切り文字の不一致 / 正規表現のエスケープ不足
- 正しい構文を意識し、特殊文字をエスケープすれば解決できる
👉 ポイントは「なぜsedが解釈できなかったのか」を理解することです。
単に修正するだけでなく、「なぜ s が必要か」「なぜエスケープしないといけないか」を意識すると、sedを使った高度な処理でも自信を持って対応できるようになります。

よくあるエラーと解決方法まとめ

