sed: エスケープされた角括弧の不一致

sed: エスケープされた角括弧の不一致

対象:![alttext](url.png)に置き換えます<img src="url.png" alt="alttext">

!一部は(...)うまくいきますが、この[...]部分は私がうまくいきません。

簡単な例として、 input と一致させたいと思いますa [test] b。これは私が使用するコマンドです:

echo 'a [test] b' | sed 's/\[[^\]]*\]/x/'

これはうまくいきません。角かっこを山かっこで置き換えると正常に動作します。

echo 'a <test> b' | sed 's/<[^>]*>/x/'

sedが同じ正規表現を理解していませんが、エスケープされた角かっこを使用するのはなぜですか? Pythonなどの他のツールでもうまく機能します。

答え1

文字クラス定義で]が直後に来ると、文字通り実行されます^。だからここから逃げないでください。また、+「1つ以上の文字」または*「0以上の文字」を意味するなどの数量子がありません。また、コマンドラインにあまりにも多くの項目がありますsed

$ echo 'a [test] b' | sed 's/\[[^]]\+\]/x/'
a x b

\+GNU拡張(現在他の実装でもサポートされています)として標準に該当するものは\{1,\}

またはもっと読みやすいです。

$ echo 'a [test] b' | sed -E 's:\[[^]]+\]:x:'
a x b

-EBSD拡張により、sedGNUおよび他のいくつかの実装でもサポートされ、-r以前のバージョンのGNUで使用されますsed。)

関連情報