2010-02-17 80 views
0

在過去,我問過這個問題。但不知何故,我沒有給出完整的input.In.Input是一個日誌文件。我正在嘗試使用sed來替換除credi卡號之外的所有數字。使用sed的正則表達式

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

這種表達肯定的作品,但它取代不僅僅是信用卡號碼,但一些otehr數據量太大(其中數字是4個以上)。其中包含信用卡號碼輸入記錄的格式爲:

"CARD_NUMBER=[6362229292929290]" 

所以我需要更換的上述format.So記錄上面的記錄應提前轉換爲

"CARD_NUMBER=[************9290]" 

感謝。

+1

請你也張貼不應該被刪除的數據的例子嗎? – Thomas 2010-02-17 17:07:51

+0

這是這個問題的後續:http://stackoverflow.com/questions/2232200/regular-expression-in-sed-for-masking-credit-card – 2010-02-17 19:06:40

回答

2

假設信用卡號碼有16個數字,我會嘗試

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

編輯(甚至測試)。謝謝,KennyTM – Messa 2010-02-17 17:16:00

+0

謝謝。信用卡號碼從12到19(來自維基百科!)。所以這隻能工作16? – user269723 2010-02-17 20:42:25

0
var1="CARD_NUMBER=[6362229292929290]" 
IFS="=" 
set -- $var1 
cardnumber=$2 
result=$(echo $cardnumber | awk 'BEGIN{OFS=FS=""}{for(i=1;i<=NF-5 ;i++){ $i="*"} }1') 
echo "$1=[$result" 

輸出

$ ./shell.sh 
CARD_NUMBER=[*************9290] 

或者使用awk

var1="CARD_NUMBER=[6362229292929290]" 
echo $var1 | awk 'BEGIN{ OFS=FS="=" } 
{ 
    gsub(/\[|\]/,"",$2) 
    m=split($2,s,"") 
    for(i=1;i<=m-4;i++){ s[i]="*" } 
    str=$1 OFS "[" 
    for(i=1;i<=m;i++){ str=str s[i] } 
    str=str "]" 
}END{ print str } ' 

輸出

上述作品的卡號任意數字長度

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

測試用例:

$ echo "blah=[123456789] CARD_NUMBER=[6362229292929290] CARD_NUMBER=[13456]" | sed -e :a -e "s/\(CARD_NUMBER=\[\**\)[0-9]\([0-9]\{4\}\)/\1\*\2/;ta" 
blah=[123456789] CARD_NUMBER=[************9290] CARD_NUMBER=[*3456] 
+0

謝謝。這是有效的。我理解除了 - 「[\ ** \)」部分之外的表達。 – user269723 2010-02-17 20:43:41

+0

@user:'\ ['匹配左方括號,'\\ **'匹配零星或更多星號,'\)'是捕獲組的結尾。 – kennytm 2010-02-17 20:46:13

0

基於我的回答here,這會掩蓋號碼的開頭和離開標籤,括號和最後四位數字的卡號的幾乎任意數字:

sed -e 'h' -e 's/.*\([0-9]\{4\}\)/\1/' -e 'x' -e 's/\(.*\[\)\([0-9]*\)\([0-9]\{4\}\)./\1\2/' -e 's/[0-9]/*/g' -e 'G' -e 's/\n//' 

如果您需要驗證總數位數只落在給定範圍內,那也可以完成。

編輯:

這裏有幾種方法:

經過該過長或過短號碼不變:

sed -e '/.*\[[0-9]\{12,19\}\]/!b' -e 'h' -e 's/.*\([0-9]\{4\}\)/\1/' -e 'x' -e 's/\(.*\[\)\([0-9]*\)\([0-9]\{4\}\)./\1\2/' -e 's/[0-9]/*/g' -e 'G' -e 's/\n//' 
 
CARD_NUMBER=[12345678] yields CARD_NUMBER=[12345678] 
CARD_NUMBER=[123456789012] yields CARD_NUMBER=[********9012] 
CARD_NUMBER=[123456789] yields CARD_NUMBER=[123456789] 

掩蓋編號的所有數字是太長或太短使用不同的掩碼字符:

sed -e '/.*\[[0-9]\{12,19\}\]/!{s/[0-9]/x/g;b}' -e 'h' -e 's/.*\([0-9]\{4\}\)/\1/' -e 'x' -e 's/\(.*\[\)\([0-9]*\)\([0-9]\{4\}\)./\1\2/' -e 's/[0-9]/*/g' -e 'G' -e 's/\n//' 
 
CARD_NUMBER=[12345678] yields CARD_NUMBER=[xxxxxxxx] 
CARD_NUMBER=[123456789012] yields CARD_NUMBER=[********9012] 
CARD_NUMBER=[123456789] yields CARD_NUMBER=[xxxxxxxxxxxxxxxxxxxx] 
+0

Thanks.Digits從12到19。 – user269723 2010-02-17 20:44:27

0

您可以使用sed中的地址字段來限制替換爲符合特定模式的行。因此,簡單地添加/CARD_NUMBER=/你表達的開始,給人

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