Regex Sed模式未替换为期望的结果
我正在尝试sed的黑客排名问题。我试图写我自己的解决方案,但没有成功。我无法找出我的解决方案不起作用的原因 示例问题:一个包含信用卡号码的文件,上面写着“4321566787651234”。我必须将此模式更改为“***********1234” 我写的Sed模式是Regex Sed模式未替换为期望的结果,regex,linux,sed,Regex,Linux,Sed,我正在尝试sed的黑客排名问题。我试图写我自己的解决方案,但没有成功。我无法找出我的解决方案不起作用的原因 示例问题:一个包含信用卡号码的文件,上面写着“4321566787651234”。我必须将此模式更改为“***********1234” 我写的Sed模式是 sed 's/([0-9]{4}) ([0-9]{4}) ([0-9]{4}) ([0-9]{4})/**** **** **** \4/' sample_data 它的输出是 4321 5667 8765 1234 似乎sed
sed 's/([0-9]{4}) ([0-9]{4}) ([0-9]{4}) ([0-9]{4})/**** **** **** \4/' sample_data
它的输出是
4321 5667 8765 1234
似乎sed与模式不匹配,这就是它按原样打印字符串的原因
我知道一些较小的解决方案,比如
sed 's/[^ ]* /****/g'
这是有效的
我又试了一次
sed 's/[^ ]+ /****/g' # replaced with * with +
它不匹配任何模式。您的
sed
命令存在多个问题:
sed
时不转义()
和{}
,或者对扩展正则表达式使用-E
或-r
,如man-sed
中所示:
-E,-r,--regexp扩展
在脚本中使用扩展正则表达式。
p
打印当前图案空间。
sed
命令:
sed-r-n's/^[0-9]{4}\s+[0-9]{4}\s+[0-9]{4}\s+([0-9]{4})/*********\1/p'样本数据
\s
:
匹配空白字符(空格和制表符)。
使用全局替换的略短选项可以写成:
sed -E 's/[0-9]{4}\s+/**** /g'
它使用扩展正则表达式来匹配:
数字[0-9]{4}\s+
和至少一个空格;及{4位}
- 将其替换为
“****”
sed 's/[0-9][0-9][0-9][0-9]\s\s*/**** /g'
其中明确列出了每个数字,\s\s*
匹配一个或多个空格,并应用相同的替换。BRE不支持ERE所支持的{4}
模式重复或+
另外,由于hackerrank很容易让你陷入困境,你可能需要在处理数字之前删掉前导和尾随的空格,例如
sed -e 's/^\s*//' -e 's/\s*$//' -e 's/[0-9][0-9][0-9][0-9]\s\s*/**** /g'
这样,您还可以处理以下行:
" 4321 5667 8765 1234 "
()
和{}
必须在sed(基本正则表达式)中转义,或者必须使用sed-E
(或sed-r
)启用扩展正则表达式。另外,您不需要捕获前三组。谢谢。你知道这个sed的/[^]+/***/g'
你说的“你知道这个”是什么意思吗?它不起作用,因为+
也被扩展,必须在BRE中转义。是的,非常感谢您提供的信息。我可以每次在sed中使用-E吗?这样我就不必关心扩展模式了;使用sed
与sed-E
相比,准确地表示必须转义的内容和不必转义的内容,请参阅。