次のコマンドの意味を見つけようとしています。
sed 's/-\([0-9.]\+\)/(\1)/g' inputfile
私はこれが数字ではなく文字に関連していることを知っています。
答え1
GNU sedでは、ダッシュの後に数字やドットが続くことを見つけ、括弧内の同じ数字に置き換えます。つまり、に-123.45
なりました(123.45)
。
macOS の BSD ベースのシステムなどの他のsed
システムでは、ダッシュ、数字、またはドット、文字通りのプラス記号を見つけ、ダッシュを削除し、残りを括弧で囲みます。つまり、それはになるがある-1+
のは(1+)
残しておく。-123
違いは、\+
基本正規表現には標準的な意味がないためです。 GNUはそれを拡張正規表現と同じように解釈します+
(つまり、「前の1つ以上」)。一方、他の人はこれを文字通り受け入れます+
。
左側のパターンの残りの部分はダッシュ自体が一致し、[0-9.]
数字または点と一致し、\( .. \)
中間部分をキャプチャします。代わりに、括弧は文字通り使用され、\1
中の内容はすべて入れ直されます\( .. \)
。
携帯性が良いはずです。
拡張REでは
sed
これをサポートすると仮定すると、-E
多くの人が次のようにします。sed -E 's/-([0-9.]+)/(\1)/'
基本REから:
sed 's/-\([0-9.]\{1,\}\)/(\1)/'
どちらも数字の前のダッシュを括弧で置き換える必要があります。
答え2
負数の形式が-
前に 1 があることから括弧で囲むものに変更されたようです。
で始まるシーケンスを検索し、数字と小数に一致する一連の-
数と小数を検索し、シーケンス内の1つ以上の対応する文字と一致するように変更します。数字と小数の順序は最初の式に入り、置換セクションでは間に最初の式が付けられています。最終結果は、数字の前の負の記号を削除し、括弧で囲むことです。[0-9.]
\+
\(...\)
(\1)
()
したがって、次のように入力します。
test value: -123.4
出力は次の形式でなければなりません。
test value: (123.4)