替换perl正则表达式匹配中的单个字符

时间:2016-12-10 15:21:47

标签: regex perl

如何替换正则表达式匹配中出现的第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]*)/){ 

任何帮助将不胜感激。

2 个答案:

答案 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_p‌​‌​0)_!$1/!

我选择了!作为分隔符,因为在替换部分中使用了/

$1是一个变量,其中包含正则表达式中第一个( )组匹配的文本(我不想重复整个过程两次)。

最终_未包含在$1中(它位于parens之外);相反,我们将/放入替换部分。

有关详细信息,请参阅perldoc perlretut

相关问题