用于屏蔽信用卡的sed中的正则表达式

use*_*723 3 sed

我们需要屏蔽信用卡号码.除了最后4位数之外的所有信息.我正在尝试使用SED.由于信用卡号码长度从12位到19位不等,我正在尝试编写正则表达式.以下代码将接收字符串.如果它包含"CARD_NUMBER = 3737291039299199"形式的字符串,它将屏蔽前12位数字.问题是如何为信用卡写12到19位数的正则表达式?如果我写了12个数字的另一个表达式,它不起作用.这意味着对于12位数的信用卡 - 应该屏蔽前8个数字.对于15位数的信用卡,应该屏蔽前11位数字.

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

    echo "Length is "$var1
    echo $data | sed -e "s/CARD_NUMBER=\[[[:digit:]]\{12}/CARD_NUMBER=\[\*\*\*\*\*\*\*\*/g"
    done
Run Code Online (Sandbox Code Playgroud)

Bet*_*eta 5

怎么样

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

(此作品在我的壳,但你可能需要添加或删除一个或两个反斜杠.)我们的想法是,以取代一个数字,然后由四位数字带星其次是四位数字,并重复这一点,直到它不再触发.


Pau*_*ce. 5

这是在一个sed没有嵌入换行符的命令中完成的:

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

如果您sed没有-r

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

如果您的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//'
Run Code Online (Sandbox Code Playgroud)

这是它在做什么:

  • 复制数字,使其在模式空间中并保持空间
  • 抓取最后四位数字
  • 将它们交换到保持空间,将整数交换到模式空间
  • 抓住除最后四位数字以外的所有数字
  • 用掩码字符替换每个数字
  • 将保留空间的最后四位数字附加到模式空间中屏蔽数字的末尾(免费换行)
  • 摆脱换行符


F'x*_*F'x 2

我不是一位sed大师,因此我无法仅用一个命令来完成它,尽管肯定有办法。但是使用两个 sed 命令,我得到的结果如下:

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

请注意嵌入的换行符

因为 sed 按行工作,所以我首先将卡号分成开头部分和最后四位数字,并用换行符分隔它们(第一个 sed 命令)。然后,我屏蔽初始部分 ( 1s/./x/g),并删除新行 ( N ; s/\n//)。

祝你好运!