![Преобразуйте это регулярное выражение в удобное для sed](https://rvso.com/image/192221/%D0%9F%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D1%83%D0%B9%D1%82%D0%B5%20%D1%8D%D1%82%D0%BE%20%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%BE%D0%B5%20%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B2%20%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%BE%D0%B5%20%D0%B4%D0%BB%D1%8F%20sed.png)
Я пытаюсь выполнить это регулярное выражение с помощью 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, чтобы можно было легко работать с каждым отдельным полем, а не со всей строкой.