我们需要屏蔽信用卡号码.除了最后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)
怎么样
sed -e :a -e "s/[0-9]\([0-9]\{4\}\)/\*\1/;ta"
(此作品在我的壳,但你可能需要添加或删除一个或两个反斜杠.)我们的想法是,以取代一个数字,然后由四位数字带星其次是四位数字,并重复这一点,直到它不再触发.
这是在一个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)
这是它在做什么:
我不是一位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//)。
祝你好运!