sed的perl替代品以拆分多个|

时间:2019-03-07 06:15:42

标签: regex perl unix

我能够在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 | | | # | # | | | | | | | | | 

3 个答案:

答案 0 :(得分:6)

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

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

我先行使用,以便能够检测到连续(且重叠!)对,并且将两个以上的|串在一起:仅消耗了比赛中的第一个,因此第二个停留在那里下一场比赛,以防万一之后又发生了一场比赛(再次用前瞻性断言)。

答案 1 :(得分:2)

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

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

$

答案 2 :(得分:0)

正确的Perl语法为:

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