![將此正規表示式轉換為 sed 內友善的](https://rvso.com/image/192221/%E5%B0%87%E6%AD%A4%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%A4%BA%E5%BC%8F%E8%BD%89%E6%8F%9B%E7%82%BA%20sed%20%E5%85%A7%E5%8F%8B%E5%96%84%E7%9A%84.png)
我正在嘗試使用 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}
但之後什麼也沒做...這是否意味著這不匹配?但 regexr 測試案例卻另有說法
例子:
A0000000000000000D
1234 1234 1234 1234
VISA 1234123412341234 EXP 1222 CVV 123
答案1
正規表示式的這一部分是錯誤的根源:[\s-.]
如果您想-
被視為括號表達式中的另一個字符,則將其放在開始或者結尾的表達式。否則,它將被視為一個範圍。
例如:
[a-z]
意思是“匹配從a到z的所有小寫字母”[-az]
或[az-]
表示“匹配破折號、‘a’或‘z’”
順便說一句,我所知道的 sed 版本都沒有將 perl-ish 理解\d
為[0-9]
or 的同義詞[:digit:]
。某些版本sed
(例如 GNU sed)將其理解\s
為空格和製表符 ( [:blank:]
) 的同義詞,但肯定不是全部。還有那些做明白\s
,大概只是明白而已外部括號表達式(我不知道有任何人能理解它的內部,[]
但這並不意味著沒有一些晦澀的 sed 變體可以理解)。
而且,據我所知, sed 不理解 perl 的意思(?:)
是非捕獲子表達式。
要使用擴展正規表示式 (ERE) 功能(如 {})而不將其轉義為\{
和\}
,您需要使用 sed 的-E
選項(轉義它們可能是 GNU 擴展,就像 一樣\+
,因此可能不適用於所有版本的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,以便您可以輕鬆地處理每個單獨的欄位而不是整行。