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