將此正則表達式轉換為在 sed 中友好
我正在嘗試使用 sed 執行此正則表達式,但似乎 sed 不支持?它說無效的字元範圍
echo "$info" | sed -e 's/(?:\d[\s-.]*){12,19}/*/g'
嘗試將任何數字範圍與 12 到 19 匹配,而不管空格、- 或 . 人物
sed: 1: "s/(?:\d[\s-.]*){12,19}/ ...": RE error: invalid character range
當我將字元範圍內的破折號向上移動到時,似乎問題已解決,
(?:\d[-\s.]*){12,19}
但之後它什麼也不做……這是否意味著這不匹配?但是正則表達式測試案例另有說明例子:
A0000000000000000D 1234 1234 1234 1234 VISA 1234123412341234 EXP 1222 CVV 123
這部分正則表達式是錯誤的來源:
[\s-.]
如果您想
-
被視為括號表達式中的另一個字元,請將其放在表達式的開頭或結尾。否則,它將被視為一個範圍。例如:
[a-z]
意思是“匹配從 a 到 z 的所有小寫字母”[-az]
或[az-]
表示“匹配破折號、‘a’ 或 ‘z’”順便說一句,我所知道的 sed 版本沒有將 perl-ish 理解
\d
為[0-9]
or的同義詞[:digit:]
。某些版本sed
(例如 GNU sed)被理解\s
為空格和製表符 ([:blank:]
) 的同義詞,但肯定不是全部。而那些確實理解的人\s
,可能只在括號表達式之外理解它(我不知道有任何人在裡面理解它,[]
但這並不意味著沒有一些晦澀的 sed 變體)。而且,AFAIK,sed 不理解 perl 的
(?:)
意思是非擷取子表達式。要使用像 {} 這樣的擴展正則表達式 (ERE) 功能而不將它們轉義為
\{
and\}
,您需要使用 sed 的-E
選項(並且轉義它們可能是 GNU 擴展,就像它是 for 一樣\+
,因此可能不適用於所有版本的 sed)。要匹配可能包含空格或破折號的 12-19 位數字並將其替換為星號,您首先需要刪除空格和破折號,然後嘗試匹配 12-19 位數字。例如
echo "$info" | sed -E -e 's/[[:blank:]-]//; s/[[:digit:]]{12,19}/*/g'
注意:如果您不關心可移植性並且永遠不可能處理古老或專有版本的 sed,那麼這會很好。否則,請堅持使用基本正則表達式 (BRE) 或使用
perl -n
orperl -p
代替sed
(如果您想使用 perl 的正則表達式方言,請務必使用 perl)。另請注意,這將影響 中的所有內容
$info
,因此所有空格和破折號都將被刪除。根據 $info 中的內容,這可能不是您想要的。如果 $info 可能包含其他文本(例如
VISA 1234123412341234 EXP 1222 CVV 123
,而不僅僅是1234123412341234
),那麼您可能應該使用 awk 或 perl 而不是 sed,以便您可以輕鬆地處理每個單獨的欄位而不是整行。