この正規表現をsed内で使いやすいように変換します

この正規表現をsed内で使いやすいように変換します

この正規表現をsedで実行しようとしていますが、sedはサポートしていないようです。無効な文字範囲と表示されます。

echo "$info" | sed -e 's/(?:\d[\s-.]*){12,19}/*/g'

空白、-、. 文字に関係なく、12 から 19 までの数字の範囲を一致させようとします

sed: 1: "s/(?:\d[\s-.]*){12,19}/ ...": RE error: invalid character range

文字範囲内でダッシュを上に移動したときに問題は解決したようです(?:\d[-\s.]*){12,19}が、その後は何も起こりません...これは一致しないことを意味しますか?しかし、正規表現のテストケースはそうではないと言っています

例:

A0000000000000000D
1234 1234 1234 1234
VISA 1234123412341234 EXP 1222 CVV 123

答え1

正規表現のこの部分がエラーの原因です:[\s-.]

-括弧式内の単なる文字として扱いたい場合は、始まりまたは終わりそれ以外の場合は、範囲として扱われます。

例えば:

  • [a-z]「aからzまでのすべての小文字に一致」を意味します
  • [-az]または[az-]「ダッシュ、'a'、または 'z' に一致する」という意味です

ところで、私が知っているsedのバージョンは、perl-ishをまたは\dの同義語として理解しません。一部のバージョン(GNU sedなど)は、スペースとタブ( )の同義語として理解しますが、すべてではありません。そして、[0-9][:digit:]sed\s[:blank:]する理解する\s、おそらく理解するだけ括弧式 (内部でそれを理解するものは知りません[]が、だからといってそれを理解する珍しい sed の変種がないというわけではありません)。

(?:)そして、私の知る限り、sed は perl の非キャプチャ部分式の意味を理解しません。

{} などの拡張正規表現 (ERE) 機能を や としてエスケープせずに使用するには\{\}sed の オプションを使用する必要があります-E( の場合と同様に、エスケープは GNU 拡張機能である可能性があるため\+、sed のすべてのバージョンで機能するとは限りません)。

12~19桁の数字を一致させるにはかもしれないスペースやダッシュが含まれている場合は、アスタリスクに置き換えて、まずスペースとダッシュを削除し、12~19桁の数字を一致させてください。例:

echo "$info" | sed -E -e 's/[[:blank:]-]//; s/[[:digit:]]{12,19}/*/g'

注: 移植性を気にせず、sed の古いバージョンや独自バージョンを扱う予定がない場合は、これで問題ありません。それ以外の場合は、基本正規表現 (BRE) を使用するか、perl -nまたはperl -pの代わりにを使用してくださいsed(perl の正規表現方言を使用する場合は、必ず perl を使用してください)。

また、これは にあるものすべてに影響するため$info、すべてのスペースとダッシュが削除されることに注意してください。 $info の内容によっては、これが望んでいる結果にならない場合があります。

VISA 1234123412341234 EXP 1222 CVV 123$info に他のテキスト (だけではなく)が含まれる可能性がある場合は1234123412341234、行全体ではなく個々のフィールドを簡単に操作できるように、sed ではなく awk または perl を使用する必要があります。

関連情報