Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex \b使用sed命令时未按预期工作_Regex_Sed - Fatal编程技术网

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
只匹配位置而不匹配字符。你最后的评论帮助我理解了这一点。谢谢,谢谢。它可以解决我所有的问题。您也可以将该链接添加到您的答案中。