首页 > 解决方案 > \b 无法使用 sed 命令按预期工作

问题描述

我试图通过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的解决方案不起作用。

标签: regexsed

解决方案


\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(whitespace),因为您的 inout 文本在数字之间有空格。

这是一篇关于单词边界的好文章


推荐阅读