sed 's/-\([0-9.]\+\)/(\1)/g' inputfile このコマンドはどういう意味ですか? [閉鎖]

sed 's/-\([0-9.]\+\)/(\1)/g' inputfile このコマンドはどういう意味ですか? [閉鎖]

次のコマンドの意味を見つけようとしています。

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)

関連情報