\\$\{を使用した正規表現がegrepでは機能しますが、sedでは機能しないのはなぜですか?

\\$\{を使用した正規表現がegrepでは機能しますが、sedでは機能しないのはなぜですか?

このような文字を与えると

./RFF_09 -f${FILE} -c${COND}

ファイル内では、このegrepコマンドは正しく一致します。

egrep './RFF(.*) (.*)-c\\$\{COND\}' file

しかし、このsedコマンドはそうではありません。

sed -n "s:'./RFF(.*) (.*)-c\\$\{COND\}':./RFF$1 $2-cRFF$1:gp"

それは失敗するでしょうsed: -e expression #1, char 38: invalid content of \{\}。私も試しました

sed -n "s:'./RFF(.*) (.*)-c\\$\{COND\}':DUMMY:gp" file
sed -n s:'./RFF(.*) (.*)-c\\$\{COND\}':DUMMY:gp file

同じ結果を得ました。

sed -n "s:'./RFF(.*) (.*)-c\\$\\{COND\\}':DUMMY:gp" file

エラーメッセージは表示されませんが、一致しません。

私は何が間違っていましたか?または、より良い方法は:元のコマンドで提案されているようにテキストをどのように変更できますか?私はかなり古いバージョンのsed(4.1.2)とegrep(2.5.1)を使用しているので、最新バージョンでエラーを再現できなくても解決策があります。

ベストアンサー1

使用する場合金利grep は grep が正規表現構文を拡張したことを意味するため、パターンを sed に送信するにはパラメータを追加するか、-r(--regexp-extended)一部-Eのバージョンにする必要があります。

表現に関しては余分なので\egrepcを使っても矛盾

\1また、$1逆マッチングを使用することをお勧めします。

したがって、最終コマンドは次のようになります。

sed -rn 's:\./(RFF.*)( .* -c)\$\{COND\}:./\1\2\1:gp'

または

sed -rn 's:(\./(RFF\S*) \S* -c)\$\{COND\}:\1\2:gp'

おすすめ記事