【问题标题】:Regex: Match a pattern followed by only one space but not 2 or more spaces or EOF正则表达式:匹配仅后跟一个空格但不包含 2 个或更多空格或 EOF 的模式
【发布时间】:2018-06-10 11:43:09
【问题描述】:

输入字符串:

1234 5678 9101 1234
2999 5178 9101 2234
9999 5628 9201 1232
8888 3678 9101 1232

上面的输入字符串在1st2nd3rd行之后有空格。最后一位数字之后的每一行都有空格,然后新行开始,除了最后一行。

最后一行以最后一个字符(数字'2')结束,之后没有其他内容。

必选匹配:我只想匹配每行中的前三个数字块(匹配不应包括块之间的单个空格)。

使用 sed 的预期输出

**** **** **** 1234 **** **** **** 2234 **** **** **** 1232 **** **** **** 1232

我的方法:我使用否定的lookbehind(我知道 sed 不支持环视断言)\d{4}(?! {2,}) 在前三行中仅匹配前三个数字块,但在第四行行匹配所有数字块(显然最后一行在最后一个数字之后没有2个空格。)

小提琴:https://regex101.com/r/VzQf3D/2

【问题讨论】:

  • 请在代码标签中也向我们展示预期的输出。
  • @RavinderSingh13 我添加了一个小提琴。不想使用 awk。我的任务是使用 sed 将每行前三个块中的每个数字替换为星号。
  • 我仍然没有看到预期的输出,请在代码标签中添加它。
  • @RavinderSingh13 我添加了预期的输出。但我只想要正则表达式中所需的匹配

标签: regex bash scripting


【解决方案1】:

对于 Perl,我会说:

perl -pe 's/(\d{4})(?= [^ ])/****/g' file

【讨论】:

    【解决方案2】:

    如果我理解的很好,你可以试试

    sed ':A;s/\(.*\)\([^ |\*]\)\([ |\*]*[ ][^ ][^ ]*[ ]*$\)/\1*\3/;tA' infile
    

    【讨论】:

      【解决方案3】:

      使用 GNU sed:

      sed -E 'h;s/^(([^ ]+ ){3})//;x;s/[^ ]*$//;s/[0-9]/*/g;G;s/\n//' file
      

      输出:

      **** **** **** 1234 **** **** **** 2234 **** **** **** 1232 **** **** **** 1232

      见:man sed

      【讨论】:

        【解决方案4】:

        由于您没有向我们展示预期的输出,因此仅根据您的解释提出此解决方案。我相信您在 Input_file 的每一行中都需要前 3 列,如果是,那么以下内容可能对您有所帮助。如果您的要求不同,请在您的帖子中的代码标签中向我们展示预期的输出,并提供更多详细信息。

        awk '{print $1,$2,$3}'  Input_file
        

        输出如下。

        1234 5678 9101
        2999 5178 9101
        9999 5628 9201
        8888 3678 9101
        

        编辑:查看您编辑的帖子,如果您不需要输出中的 3 列之间的空间,那么以下内容可能对您有所帮助。

        awk '{print $1 $2 $3}' Input_file
        

        【讨论】:

          【解决方案5】:

          怎么样

          ^(?:(?:^| +)[0-9]{4})(?=[0-9]{4} $)
          

          【讨论】:

            【解决方案6】:

            我不确定 bash,但对于普通的正则表达式我会使用

            ^(?: *)(\d{4})(?: +)(\d{4})(?: +)(\d{4})  # with multiline flag
            

            解释:

            ^ is line start 
            (?: *) is a non capturing group of any number of spaces
            (\d{4}) is a capturing group of 4 digit
            (?: +) is a non capturing group of one or more number of spaces
            (\d{4}) is a capturing group of 4 digit
            (?: +) is a non capturing group of one or more number of spaces
            (\d{4}) is a capturing group of 4 digit
            

            小提琴:https://regexr.com/3ike0


            如果您对此正则表达式使用sed,则根据

            ,非捕获组是不可能的

            how do you specify non-capturing groups in sed?

            https://stackoverflow.com/a/36546377/7505395 以及为此问题提供的其他人回答。对不起。

            【讨论】:

            • 您的解决方案效果很好,但它甚至可以匹配块之间的单个空格。抱歉,我后来编辑了问题以包含它。
            • @HarshvardhanSharma - 将其更改为忽略空格 - 见小提琴
            • @HarshvardhanSharma 并更新了解释。您可以在每行正则表达式匹配的单独组中找到没有空格的每个数字
            • 您的解决方案也捕获了空间。它不应该捕获空格,只应该匹配数字块(每个块中的 4 个数字)。
            • @HarshvardhanSharma 它不捕获空格。对于正则表达式,有一个“匹配”和“组”-“组”是捕获的东西所在的位置-“匹配”是整个包括非捕获组-通过使用来自“组”你得到真正捕获的东西 - 没有空格。不确定 bash - 你在这个 RegEx 模式中使用了什么 bash 命令?
            猜你喜欢
            • 1970-01-01
            • 2014-05-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多