Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.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 Sed模式未替换为期望的结果_Regex_Linux_Sed - Fatal编程技术网

Regex 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的黑客排名问题。我试图写我自己的解决方案,但没有成功。我无法找出我的解决方案不起作用的原因

示例问题:一个包含信用卡号码的文件,上面写着“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/[^ ]* /****/g'
这是有效的

我又试了一次

sed 's/[^ ]+ /****/g' # replaced with * with +

它不匹配任何模式。

您的
sed
命令存在多个问题:

  • 使用
    sed
    时不转义
    ()
    {}
    ,或者对扩展正则表达式使用
    -E
    -r
    ,如
    man-sed
    中所示:

    -E,-r,--regexp扩展

    在脚本中使用扩展正则表达式。

  • 缺少图案空间的打印

    p

    打印当前图案空间。

  • 此外,不需要捕获前3个数字组

    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
    相比,准确地表示必须转义的内容和不必转义的内容,请参阅。