perl替代sed分裂多个|

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了perl替代sed分裂多个|相关的知识,希望对你有一定的参考价值。

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

input           ==>  a|123|##||||
expected output ==>  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'

输出以上命令

| a | | | 1 | 2 | 3 | | | # | # | | | | | | | | | 
答案

仅在彼此相邻的那些|之间添加空间

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

我使用前瞻为了能够检测连续(和重叠!)对,两个以上的|串在一起:只有第一个匹配被消耗,所以第二个留在那里进行下一场比赛,以防万一在它之后又是另一个(再次断言)。

另一答案

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

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

$
另一答案

正确的Perl语法将是:

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

以上是关于perl替代sed分裂多个|的主要内容,如果未能解决你的问题,请参考以下文章

作为sed替代方案的Perl就地替换

Perl:模板工具包的替代品

Pyp–一个替代sed,awk的文本处理工具

SaaS 数据库设计 - 多个数据库?分裂? [关闭]

shell grep命令的多个正则表达式 组合使用。

Perl 的排队系统