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

时间:2010-02-09 20:10:45

标签: 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

4 个答案:

答案 0 :(得分:5)

怎么样

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

(这适用于我的shell,但你可能需要添加或删除反斜杠或两个。)我的想法是用一个星号后跟四个数字替换一个数字后跟四位数字,并重复此操作直到它为止更长的触发器。

答案 1 :(得分: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//'

这是它正在做的事情:

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

答案 2 :(得分:2)

试试这个,你不必创建复杂的正则表达式

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

答案 3 :(得分: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//)。

祝你好运!