將此正規表示式轉換為 sed 內友善的

將此正規表示式轉換為 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}但之後什麼也沒做...這是否意味著這不匹配?但 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 -norperl -p代替sed(如果您想使用 perl 的正規表示式方言,則一定要使用 perl)。

另請注意,這將影響 中的全部內容$info,因此所有空格和破折號都將被刪除。根據 $info 中的內容,這可能不是您想要的。

如果 $info 可能包含其他文字(例如,VISA 1234123412341234 EXP 1222 CVV 123而不僅僅是1234123412341234),那麼您可能應該使用 awk 或 perl 而不是 sed,以便您可以輕鬆地處理每個單獨的欄位而不是整行。

相關內容