2010-02-09 4 views
3

Нам нужно скрыть номера кредитных карт. Маскировать все, кроме последних 4 цифр. Я пытаюсь использовать SED. Поскольку длина номера кредитной карты варьируется от 12 цифр до 19, я пытаюсь написать регулярное выражение. Получаемый код получит строку. Если он содержит String формы «CARD_NUMBER = 3737291039299199», он будет маскировать первые 12 цифр. Проблема в том, как написать регулярное выражение для кредитной карты от 12 до 19 цифр? Если я напишу еще одно выражение для 12 цифр, это не сработает. Это означает, что для 12-значной кредитной карты первые 8 цифр должны быть замаскированы. для 15-значной кредитной карты первые 11 цифр должны быть замаскированы.регулярное выражение в sed для маскировки кредитной карты

while read data; do 
    var1=${#data} 

    echo "Length is "$var1 
    echo $data | sed -e "s/CARD_NUMBER=\[[[:digit:]]\{12}/CARD_NUMBER=\[\*\*\*\*\*\*\*\*/g" 
    done 

ответ

1

Я не так много sed гуру, и, таким образом, я не могу управлять, чтобы сделать это только в одной команде, хотя, конечно, есть способы. Но с двумя SED команды, вот что я получил:

sed -e 's/CARD_NUMBER=\([0-9]*\)\([0-9]\{4\}\)/\1\ 
\2/' | sed -e '1s/./x/g ; N ; s/\n//' 

Пожалуйста, обратите внимание на встроенный символ новой строки.

Поскольку sed работает по строкам, я сначала разбиваю номер карты на начальную часть и последние четыре цифры, разделяя их на новую строку (первая команда sed). Затем я маскирую начальную часть (1s/./x/g) и удаляю новую строку (N ; s/\n//).

Удачи вам!

5

Как насчет

 
sed -e :a -e "s/[0-9]\([0-9]\{4\}\)/\*\1/;ta" 

(Это работает в моей оболочке, но вы можете добавить или удалить обратный косую черту или два.) Идея состоит в том, чтобы заменить цифру следует четыре цифры со звездой с последующей четыре цифры, и повторите это, пока он больше не активирует.

+0

Спасибо, но это дается error- $ эхо «4664738575834567» | sed -e: a -e "s/[0-9] \ ([0-9] \ {4 \} \)/\ * \ 1 /: ta" "Неизвестный вариант для 's' – user269723

+0

Извините, – Beta

+0

Привет, спасибо, но небольшая проблема. Ввод - это что-то вроде: «CARD_NUMEBR = [72727272727272727]» и вывод должен быть «CARD_NUMEBR = [************] 3737] «В приведенном выше выражении я пытаюсь установить CARD_NUMEBR [но не работает.] – user269723

2

попробовать это, вы не должны создавать сложный Regex

var1="CARD_NUMBER=3737291039299199" 
IFS="=" 
set -- $var1 
cardnumber=$2 
echo $cardnumber | awk 'BEGIN{OFS=FS=""}{for(i=1;i<=NF-4 ;i++){ $i="*"} }1' 

выхода

$ ./shell.sh 
************9199 
4

Это делает его одним sed команды без встроенной новой строки:

sed -r 'h;s/.*([0-9]{4})/\1/;x;s/CARD_NUMBER=([0-9]*)([0-9]{4})/\1/;s/./*/g;G;s/\n//' 

Если у вашего sed нет -r:

sed 'h;s/.*\([0-9]\{4\}\)/\1/;x;s/CARD_NUMBER=\([0-9]*\)\([0-9]\{4\}\)/\1/;s/./*/g;G;s/\n//' 

Если sed потребности -e:

sed -e 'h' -e 's/.*\([0-9]\{4\}\)/\1/' -e 'x' -e 's/CARD_NUMBER=\([0-9]*\)\([0-9]\{4\}\)/\1/' -e 's/./*/g' -e 'G' -e 's/\n//' 

Вот что он делает:

  • дублировать номер, так это в шаблон пространства и держать пространство
  • захватить последние четыре цифры
  • обменять их на удержание и целое число i Nto картина пространство
  • GRAP все, кроме последних четырех цифр
  • заменить каждую цифру с маской символа
  • Append последние четыре цифры из трюма до конца замаскированных цифр шаблона (перевод строки поставляется вместе для бесплатно)
  • избавиться от символа новой строки
+0

+1 Впечатляет. Но я думаю, что 4-й шаг может быть немного короче: s/[ 0-9] {4} $ // – Beta

 Смежные вопросы

  • Нет связанных вопросов^_^