交換しようとしています。キーワード{}
または同じ中括弧でマークしてください{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 %@ %@