我要替换这个:
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的解决方案。
答案 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 前斜杠。然后,也匹配并捕获最后一个正斜杠 之后的所有内容。最后,用前两个捕获组替换,但现在用逗号分隔。
注意:
/
必须用反斜杠转义,以区别于模式分隔符