この正規表現を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をor\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(Basic Regular Expressions)を使用するか、代わりにperl -norを使用してください(Perlの正規表現方言を使用するには、Perlを使用してください)。perl -psed

また、これはすべての項目に影響を与えるため、$infoすべてのスペースとダッシュが削除されます。 $ infoの内容によっては、あなたが望むものではないかもしれません。

VISA 1234123412341234 EXP 1222 CVV 123$ infoに他のテキスト(例ではない)を含めることができる場合は、行1234123412341234全体ではなく各個々のフィールドを簡単に処理できるように、sedの代わりにawkまたはperlを使用する必要があります。

おすすめ記事