我正在尝试使用 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,以便您可以轻松地处理每个单独的字段而不是整行。