はじめに
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を使った高度な処理でも自信を持って対応できるようになります。

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