私のスクリプトでは、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