正規表現の予期しない結果を置き換える

正規表現の予期しない結果を置き換える

交換しようとしています。キーワード{}または同じ中括弧でマークしてください{date}。これには正規表現を使用します。{name}%@{(.*?)\}

だから私は次のようなテストスクリプトを書いた。

echo "hello { welcome } and { welcome} home {friend } {(friend)}" | sed "s; {\(.*\?\)\}; %@; g"

output: hello %@

hello %@ and %@ home %@ %@しかし、私は結果を期待しています。

より簡単な交換は完全に機能します。

echo "hello {} and {} home {} {}" | sed -e "s; {\}; %@; g"

output: hello %@ and %@ home %@ %@

今、この問題を解決する方法についてのアイデアはありません。

答え1

 {\(.*\?\)\}

見て、これは.*貪欲なので、上記の正規表現は最初の行{から最後の行まで}一致します。これは出力を正当化します。

さらに、キャプチャグループに対して何もしないため、グループを削除でき、\( \)最後の中括弧をエスケープする必要はありません。したがって、正規表現は次のように書き直すことができます{.*\?}

Perlの正規表現に慣れているので、混乱する可能性があります。 Perl正規表現は.*?貪欲ではありませんが、sedそれを使用する代わりにBRE基本正規表現を使用します。

ここで、希望の出力を取得するには、次のように実行します。

 {[^}]*}

これは中かっこ内のすべての値と一致します。つまり、[^}]*「文字ではないすべての数}」を意味します。

$ echo "hello { welcome } and { welcome} home {friend } {(friend)}" | 
  sed "s; {[^}]*}; %@; g"
hello %@ and %@ home %@ %@

関連情報