Konvertieren Sie diesen regulären Ausdruck, damit er innerhalb von sed benutzerfreundlich ist

Konvertieren Sie diesen regulären Ausdruck, damit er innerhalb von sed benutzerfreundlich ist

Ich versuche, diesen regulären Ausdruck mit sed auszuführen, aber es scheint, als würde sed dies nicht unterstützen? Es wird ein ungültiger Zeichenbereich angezeigt

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

Es wird versucht, jeden Ziffernbereich zwischen 12 und 19 abzugleichen, unabhängig von Leerzeichen, - oder .-Zeichen.

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

Scheint, als wäre das Problem behoben, als ich den Bindestrich im Zeichenbereich nach oben verschoben habe, (?:\d[-\s.]*){12,19}aber danach passiert nichts mehr ... Bedeutet das, dass dies nicht übereinstimmt? Aber Regexr-Testfälle sagen etwas anderes

Beispiel:

A0000000000000000D
1234 1234 1234 1234
VISA 1234123412341234 EXP 1222 CVV 123

Antwort1

Dieser Teil des regulären Ausdrucks ist die Fehlerquelle:[\s-.]

Wenn Sie -wie ein weiteres Zeichen in einem Klammerausdruck behandelt werden möchten, setzen Sie es an dieAnfangoder derEndedes Ausdrucks. Andernfalls wird es als Bereich behandelt.

Zum Beispiel:

  • [a-z]bedeutet „alle Kleinbuchstaben von a bis z abgleichen“
  • [-az]oder [az-]bedeuten „passt zu einem Bindestrich, einem ‚a‘ oder einem ‚z‘“

Übrigens versteht keine mir bekannte Version von sed das Perl-artige \dals Synonym für [0-9]oder [:digit:]. Einige Versionen von sed(z. B. GNU sed) verstehen \sals Synonym für Leerzeichen und Tabulatoren ( [:blank:]), aber sicherlich nicht alle. Und diejenigen, dieTunverstehen \s, wahrscheinlich nur verstehendraußenvon Klammerausdrücken (ich kenne keinen, der das von innen versteht, []aber das heißt nicht, dass es nicht irgendeine obskure sed-Variante gibt, die das tut).

Und meines Wissens versteht sed „Perl“ nicht (?:)als einen nicht erfassenden Unterausdruck.

Um Funktionen für erweiterte reguläre Ausdrücke (ERE) wie {} zu verwenden, ohne sie als \{und zu maskieren \}, müssen Sie -Edie Option von sed verwenden (und das Maskieren kann eine GNU-Erweiterung sein, wie es bei der Fall ist \+, und funktioniert daher möglicherweise nicht bei allen Versionen von sed).

Um 12-19 Ziffern abzugleichen, diekönnteLeerzeichen oder Bindestriche enthalten und diese durch Sternchen ersetzen, müssen Sie zuerst die Leerzeichen und Bindestriche entfernen und dann versuchen, 12-19 Ziffern abzugleichen. zB

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

HINWEIS: Wenn Portabilität für Sie kein Problem ist und Sie wahrscheinlich nie mit alten oder proprietären Versionen von sed arbeiten werden, ist dies kein Problem. Andernfalls bleiben Sie bei Basic Regular Expressions (BRE) oder verwenden Sie perl -noder perl -panstelle von sed(und verwenden Sie auf jeden Fall Perl, wenn Sie den Perl-Dialekt für reguläre Ausdrücke verwenden möchten).

Beachten Sie auch, dass dies den gesamten Inhalt betrifft $info, d. h. alle Leerzeichen und Bindestriche werden entfernt. Je nachdem, was in $info steht, ist dies möglicherweise nicht das, was Sie möchten.

Wenn $info wahrscheinlich anderen Text enthält (z. B. VISA 1234123412341234 EXP 1222 CVV 123statt nur 1234123412341234), sollten Sie wahrscheinlich awk oder Perl statt sed verwenden, damit Sie problemlos mit jedem einzelnen Feld statt mit der gesamten Zeile arbeiten können.

verwandte Informationen