Bash

將此正則表達式轉換為在 sed 中友好

  • June 18, 2021

我正在嘗試使用 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 -norperl -p代替sed(如果您想使用 perl 的正則表達式方言,請務必使用 perl)。

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

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

引用自:https://unix.stackexchange.com/questions/654286