Преобразуйте это регулярное выражение в удобное для 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}но после этого ничего не произошло... Означает ли это, что это не соответствует? Но тестовые случаи regexr говорят об обратном

Пример:

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как синоним [0-9]или [:digit:]. Некоторые версии sed(например, GNU sed) понимают \sкак синоним пробелы и табуляции ( [:blank:]), но, конечно, не все. А те, которыеделатьпонимаю \s, наверное, понимаю только этоснаруживыражений в квадратных скобках (я не знаю ни одного, который бы это понимал, []но это не значит, что нет какого-то малоизвестного варианта sed, который это понимает).

И, насколько мне известно, sed не понимает, что Perl (?:)подразумевает незахватывающее подвыражение.

Чтобы использовать функции расширенных регулярных выражений (ERE), такие как {}, не экранируя их как \{и \}, вам нужно использовать -Eопцию sed (а их экранирование может быть расширением 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, это может быть не то, что вам нужно.

Если $info, скорее всего, будет содержать другой текст (например, VISA 1234123412341234 EXP 1222 CVV 123вместо просто 1234123412341234), то вам, вероятно, следует использовать awk или perl вместо sed, чтобы можно было легко работать с каждым отдельным полем, а не со всей строкой.

Связанный контент