【问题标题】:perl alternative for sed to split multiple |perl 替代 sed 拆分多个 |
【发布时间】:2019-07-28 22:47:31
【问题描述】:

我能够在 sed 命令中完成此操作,但无法使其在 perl 中运行。想在没有任何空格或字母数字的情况下在靠近的竖线字符之间添加空格。

输入 ==> a|123|##|||| 预期输出 ==> a|123|##| | | |

这个sed 命令工作正常:

echo "a|123|##||||" | sed 's/\([^[:blank:][:alnum:]]\)|/\1 | /g'

上述命令的输出 ==> a|123|## | | | |

在 perl 中,我无法让它工作

echo "a|123|##||||" | perl -pe 's/\([^[:blank:][:alnum:]]\)|/\1 | /g'

上面命令的输出

|一个 | | | 1 | 2 | 3 | | | # | # | | | | | | | | |

【问题讨论】:

    标签: regex perl unix


    【解决方案1】:

    仅在相邻的| 之间添加空格

    echo "a|123|##||||" | perl -pe's/\|(?=\|)/\| /g'
    

    我使用前瞻来检测连续(和重叠!)对,将两个以上的| 串在一起:匹配中只有第一个被消耗,所以第二个留在那里等待下一个匹配,以防后面还有另一个(再次通过前瞻断言)。

    【讨论】:

      【解决方案2】:

      另一种同时使用前瞻和后瞻的方式。

      $ echo "a|123|##||||" | perl -pe's/(?<=\|)(?=\|)/ /g '
      a|123|##| | | |
      
      $
      

      【讨论】:

        【解决方案3】:

        正确的 Perl 语法应该是:

        echo "a|123|##||||" | perl -pe 's/([^\s\w])\|/$1 | /g'
        
        • 管道字符必须转义
        • $1 用于第一场小组赛

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-06-16
          • 2019-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-21
          • 1970-01-01
          相关资源
          最近更新 更多