用于屏蔽信用卡的sed正则表达式
我们需要屏蔽信用卡号码。屏蔽除最后4位以外的所有数字。我正在尝试使用SED。由于信用卡号的长度从12位到19位不等,我正在尝试编写正则表达式。下面的代码将接收字符串。若它包含形式为“CARD_NUMBER=3737291039299199”的字符串,它将屏蔽前12位数字。 问题是如何为信用卡编写12到19位长的正则表达式?如果我为12位数写另一个表达式,它就不起作用了。这意味着对于12位数的信用卡,前8位数应该被屏蔽。对于15位数的信用卡,前11位数应该被屏蔽用于屏蔽信用卡的sed正则表达式,sed,Sed,我们需要屏蔽信用卡号码。屏蔽除最后4位以外的所有数字。我正在尝试使用SED。由于信用卡号的长度从12位到19位不等,我正在尝试编写正则表达式。下面的代码将接收字符串。若它包含形式为“CARD_NUMBER=3737291039299199”的字符串,它将屏蔽前12位数字。 问题是如何为信用卡编写12到19位长的正则表达式?如果我为12位数写另一个表达式,它就不起作用了。这意味着对于12位数的信用卡,前8位数应该被屏蔽。对于15位数的信用卡,前11位数应该被屏蔽 while read data;
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//'
下面是它正在做的事情:
- 复制数字,使其位于图案空间并保留空间
- 抓住最后四个数字
- 将它们交换到保持空间,将整数交换到模式空间
- 除最后四位数字外,其余数字均为图形
- 用掩码字符替换每个数字
- 将保留空间中的最后四个数字附加到模式空间中屏蔽数字的末尾(免费换行)
- 摆脱新线
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//'