【Linuxトラブル解決】sed: -e expression #1, char 1: unknown command の原因と解決方法

  • URLをコピーしました!
目次

はじめに

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

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