我想将last /替换为

时间:2019-05-03 04:57:48

标签: perl

我要替换这个:

a/b/c|d,385|386|387|388|389|390|391|392|393|394|395|396|397|398|399|400/0.162,214|229|254|255|270|272|276|287|346|356|361|362|365|366|367|369/0.18,improve/11.11,

使用:

a/b/c|d,385|386|387|388|389|390|391|392|393|394|395|396|397|398|399|400/0.162,214|229|254|255|270|272|276|287|346|356|361|362|365|366|367|369/0.18,improve,11.11,

使用此sed命令:

sed -i 's/\(.*\)\//\1,/'

这在Unix中有效。我试图在Perl代码中将其与系统一起使用,但是它不起作用。我请求在Perl中使用sed的解决方案。

2 个答案:

答案 0 :(得分:3)

首先,您要求的代码无效。

$ printf 'a/b/c\n' | sed 's/(.*)//\1,/'
sed: -e expression #1, char 9: unknown option to `s'

应该是

$ printf 'a/b/c\n' | sed 's/\(.*\)\//\1,/'
a/b,c

您在问如何从Perl执行此命令。您可以使用以下内容:

 system('sed', '-i', '/\\(.*\\)\\//\\1,/', '--', $qfn)

请注意,您可以在Perl本身中轻松地完成相同的任务。

local @ARGV = $qfn;
local $^I = '';
while (<>) {
    s{^.*\K/}{,};
    print;
}

答案 1 :(得分:0)

这是在sed中执行此操作的方法:

echo "365|366|367|369/0.18,improve/11.11," | sed 's/^\(.*\)\/\(.*\)$/\1,\2/'

      365|366|367|369/0.18,improve,11.11,

使用的正则表达式模式是:

^\(.*\)\/\(.*\)$

这表示要匹配并捕获所有内容,直到 last 前斜杠。然后,也匹配并捕获最后一个正斜杠 之后的所有内容。最后,用前两个捕获组替换,但现在用逗号分隔。

注意:

  • 正斜杠/必须用反斜杠转义,以区别于模式分隔符
  • 捕获组中的括号也需要使用反斜杠转义