如何替换正则表达式匹配中出现的第6个“_”?
这是要搜索的文字输入。它不代表输入的路径:
/Users/rob/Documents/Test/m160505_031746_42156_c100980652550000001823221307061611_s1_p0_30_0_59.fsa
这是我的代码,它解析了我需要的东西。我现在需要将最后匹配的“_”替换为“/”:
#!/usr/bin/perl
use strict;
use warnings;
open(IN, '<', '/Users/roblogan/Test_Database.txt') or die $!;
open(OUT, '>', '/Users/roblogan/Test_Output.txt') or die $!;
while (my $line = <IN>){
if ($line =~ m/(m160505_031746_42156_c100980652550000001823221307061611_s1_p0_[0-9]*)/){
print OUT $1, "\n";
}
}
当前输出:
m160505_031746_42156_c100980652550000001823221307061611_s1_p0_30
期望的输出:
m160505_031746_42156_c100980652550000001823221307061611_s1_p0/30
我试过了:
if ($line =~ s/(m160505_031746_42156_c100980652550000001823221307061611_s1_p0_[0-9]*)/(m160505_031746_42156_c100980652550000001823221307061611_s1_p0\/[0-9]*)/){
任何帮助将不胜感激。
答案 0 :(得分:1)
这个Perl代码将根据您的主题行和示例输出确定我认为您需要的内容
它在目标字符串中找到第六个下划线,如果该下划线后跟十进制数字,它会将下划线更改为斜线并删除数字后面的所有内容
我使用管道符|
作为替换运算符s///
的分隔符,以避免需要转义正斜杠
use strict;
use warnings 'all';
my $path = q{/Users/rob/Documents/Test/m160505_031746_42156_c100980652550000001823221307061611_s1_p0_30_0_59.fsa};
$path =~ s|^(?:[^_]*_){5}[^_]*\K_(\d+).*|/$1|s;
print $path, "\n";
/Users/rob/Documents/Test/m160505_031746_42156_c100980652550000001823221307061611_s1_p0/30
答案 1 :(得分:0)
根据您的描述,最简单的方法是:
$line =~ s!(m160505_031746_42156_c100980652550000001823221307061611_s1_p0)_!$1/!
我选择了!
作为分隔符,因为在替换部分中使用了/
。
$1
是一个变量,其中包含正则表达式中第一个(
)
组匹配的文本(我不想重复整个过程两次)。
最终_
未包含在$1
中(它位于parens之外);相反,我们将/
放入替换部分。
有关详细信息,请参阅perldoc perlretut
。