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

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

我们需要屏蔽信用卡号码。屏蔽除最后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

我不是一个什么
sed
guru,因此我不能仅用一个命令就能做到这一点,尽管肯定有办法。但有了两个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/

祝你好运

怎么样

sed -e :a -e "s/[0-9]\([0-9]\{4\}\)/\*\1/;ta" sed-e:a-e“s/[0-9]\([0-9]\{4\}\)/\*\1/;ta”
(这在我的shell中有效,但您可能需要添加或删除一个或两个反斜杠。)方法是将一个数字后跟四个数字替换为一个星形后跟四个数字,并重复此操作,直到不再触发为止。

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

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

这在一个
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//'
下面是它正在做的事情:

  • 复制数字,使其位于图案空间并保留空间
  • 抓住最后四个数字
  • 将它们交换到保持空间,将整数交换到模式空间
  • 除最后四位数字外,其余数字均为图形
  • 用掩码字符替换每个数字
  • 将保留空间中的最后四个数字附加到模式空间中屏蔽数字的末尾(免费换行)
  • 摆脱新线

谢谢,但这给出了一个错误-$echo“4664738575834567”| sed-e:a-e“s/[0-9]([0-9]\{4\}/**\1/:ta”“未知选项为's'Hi,谢谢,它工作正常,但有点小问题。输入类似于“CARD\u NUMEBR=[72727]”,输出应该是“CARD\u NUMEBR=[**********************3737]”在上面的表达式中,我试图将CARD\u NUMEBR放入[但不起作用。真的吗?它对我有效,sed v4.1.5。我们可以尝试一个实验。它做什么:echo卡号=[12345689];sed-e“s/[0-9]([0-9]{4})/*\1/“你应该使用单引号,而不是双引号。试试
sed-e:a-e's/[0-9]\([0-9]\{4})/\*\1/;ta'
+1。但我认为第四步可以短一点:s/[0-9]{4}$//
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//'