Regex \b使用sed命令时未按预期工作
我试图只使用Regex \b使用sed命令时未按预期工作,regex,sed,Regex,Sed,我试图只使用sed来解决交给我的一项任务。任务是: 给定信用卡号行,用星号(即*)遮罩每个信用卡号的前几位,并在新行上打印遮罩的卡号。每个信用卡号由四个空格分隔的四位数组组成。例如,信用卡号码1234 5678 9101 1234将被屏蔽并打印为*********1234 我已成功使用以下命令。它按预期工作并打印所需输出 sed 's/\([0-9]\{4\}\s\)\{3\}\([0-9]\{4\}\)/**** **** **** \2/' 但是,我尝试了另一个使用\b的解决方案,但它不起
sed
来解决交给我的一项任务。任务是:
给定信用卡号行,用星号(即*)遮罩每个信用卡号的前几位,并在新行上打印遮罩的卡号。每个信用卡号由四个空格分隔的四位数组组成。例如,信用卡号码1234 5678 9101 1234将被屏蔽并打印为*********1234
我已成功使用以下命令。它按预期工作并打印所需输出
sed 's/\([0-9]\{4\}\s\)\{3\}\([0-9]\{4\}\)/**** **** **** \2/'
但是,我尝试了另一个使用\b
的解决方案,但它不起作用。我不明白为什么它不起作用<代码>\b应匹配单词的开头和空格。我知道它可以用\s
解决,但我只想了解\b
解决方案的问题
sed 's/\(\b[0-9]\{4\}\b\)\{3\}\([0-9]\{4\}\)/**** **** **** \2/'
注意:因为我有一个有效的解决方案。我只是想了解为什么我使用
\b
的解决方案不起作用。\b
在gnu sed
中确实起作用,但您的第二个正则表达式不正确
您应该使用:
sed 's/\b\([0-9]\{4\}\s\)\{3\}\([0-9]\{4\}\)/**** **** **** \2/' file
或使用-E
sed -E 's/\b([0-9]{4}\s){3}([0-9]{4})/**** **** **** \2/' file
请注意,第二个\b
应替换为\s
(空白),因为您的输入文本在数字之间有空格
您使用的是什么版本的sed?不同的版本识别不同的正则表达式。您可以考虑:
sed-E的/[[:digit:]{4}([^[:digit:]])/***\1/g'
sed(GNU-sed)4.7
。我只是想了解为什么\b版本不起作用。我不知道为什么我的问题被否决了!出于某种原因,我的答案也被否决了。我对这个问题投了赞成票,以抵消不必要的反对票。有什么问题吗?我知道我可以用\s
来做,因为我已经解决了这个问题,但不确定为什么\b
在regex子表达式中不起作用?\b
也可以像您在我的regex中看到的那样起作用。但是\b
是单词边界,不能与空格匹配。您输入的是1234 5678 9101 1234
,因此您也需要匹配数字之间的空格。因此,即使是sed的/\(\b[0-9]\{4\}\b\s\)\{3\\\\([0-9]\{4\})/*********************\2/'
也会对您有效,但由于冗余的\b
谢谢您的回答。问题是\b
只匹配位置而不匹配字符。你最后的评论帮助我理解了这一点。谢谢,谢谢。它可以解决我所有的问题。您也可以将该链接添加到您的答案中。