sedコードを処理する次の数字はどういう意味ですか?

sedコードを処理する次の数字はどういう意味ですか?

私のスクリプトでは、3つの数字の後に「、」を追加するコードスニペットを見つけました。このコードは数値データのみを考慮します。

以下はコードです。

sed 's/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g' number.txt

番号.txt

1234
12345
123456

出力

1,234
12,345
123,456
1234,567

コードフローを誰が説明できますか?

答え1

sed(Sトレメ編集するitor) は以下で実行できます.S検索と置換モードの使用一般的な表現。 sed 関連のエスケープはいくつかありますが、正規表現自体の場合は、以下で通訳ツールを付与できます。正規表現:

( グループ#1をキャプチャします。複数のトークンをまとめてグループ化し、キャプチャグループを作成して部分文字列を抽出するか、逆参照を使用します。

^ スタート。文字列の先頭に一致します。

| 交互に。これはブールORのように機能します。前後の式と一致します|

[^ セットを否定します。セットにないすべての文字と一致します。

0-9 範囲。「0」から「9」の範囲の文字と一致します。大文字と小文字を区別します。

. 特徴。「。」機能と一致します。

]

)

( グループ#2をキャプチャします。複数のトークンをまとめてグループ化し、キャプチャグループを作成して部分文字列を抽出するか、逆参照を使用します。

[ 文字セット。セット内のすべての文字と一致します。

0-9 範囲。「0」から「9」の範囲の文字と一致します。大文字と小文字を区別します。

]

+ 数量子。前のトークンの1つ以上と一致します。

)

( グループ#3をキャプチャします。複数のトークンをまとめてグループ化し、キャプチャグループを作成して部分文字列を抽出するか、逆参照を使用します。

[ 文字セット。セット内のすべての文字と一致します。

0-9 範囲。「0」から「9」の範囲の文字と一致します。大文字と小文字を区別します。

]

{3} 数量子。前に示したマッチ 3.

)

答え2

このパターンは、(1)線の先頭または数字または点以外の項目、(2)任意の数字、少なくとも1桁、(3)正確に3桁をキャプチャします。次に、(2)と(3)の間にカンマを使用して再配置し、効果的に千単位の区切り文字を追加します。最初のグループは小数点以下の小数点部分に触れなければ1.2345なりません1.2,345

()パターンは基本正規表現(BRE)で書かれており、特別にするには各パターンの前にバックスラッシュを追加する必要があります{}。しかも必ず必要なものもGNU sed、BREの\+拡張\|も特別な意味を持ちます。。このコマンドは拡張正規表現(sed -E多くのsed実装でサポートされています)で書くのが最善です。

sed -E 's/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g'

さらに、パターンは一度だけ置き換えられ、同じ数に数千の区切り文字を追加しません。最後の項目は/g同じ行で複数回一致しますが、すでに置き換えられているデータは処理されません。1234567なるでしょう1234,567、そうではありません1,234,567。この問題を解決するには、ループを追加する必要があります。

sed -E -e :a  -e 's/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g' -e ta

ここでは、:aちょうどラベル、最後ta ティー交換が成功したかどうかをテストし、交換が完了したかどうかに戻り、実際に操作をa実行したのと同じ回数だけプロセスを繰り返します。だから1234567それはなります1,234,567

答え3

  • sed 's/foo/bar/g' number.txt:ファイルを読み、number.txt正規表現パターンfooをに置き換えますbar。これは、各行のすべての一致に対して発生します()/g
  • \(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\):交換するパターンです。エスケープされた括弧内の各部分は\(…\)「キャプチャグループ」です。内部パターンは、後で使用するために「捕捉」される。
    • \(^\|[^0-9.]\):行の先頭、^数字\|、ピリオド以外の文字を探します[^0-9.]。これは本質的に数字の前の文字を探します。
    • \([0-9]\+\):1つ以上の数字を見つけます[0-9]\+
    • \([0-9]\{3\}\):3つの数字を見つけます[0-9]\{3\}
  • \1\2,\3:上記の一致を最初の2つのキャプチャグループに置き換え、最後の,キャプチャグループに置き換えます。つまり、,2番目のパターンと3番目のパターンの間に挿入します。

「欲」が強いため、sed試合時間を最大限に増やそうとする。したがって、最終キャプチャグループは数字の最後の3桁になります。

など\の多くの「特殊」文字がエスケープされます。 「拡張正規表現」を使用またはサポートしている場合は、エスケープする必要はありません。これにより、読みやすさが向上します。\(…\)\{3\}sed-E-r

関連情報