将此正则表达式转换为 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,以便您可以轻松地处理每个单独的字段而不是整行。

相关内容