Regex 替换每行上的前x个引用

Regex 替换每行上的前x个引用,regex,perl,replace,Regex,Perl,Replace,在linux上使用perl,我试图解析来自FIFO的输入,截断每行的一部分,并替换剩余的一些字符——以便将其格式化为命令行实用程序,当FIFO中的所有挂起行都被修改时,将调用该实用程序 我的输入可以如下所示: [1466621350] PROCESS_SERVICE_CHECK_RESULT;rs301;Disk IOPS;0;No disks exceeds defined IOPS thresholds | sda=1.40;100;200 sdb=0.00;200;400 sdc=0.00

在linux上使用perl,我试图解析来自FIFO的输入,截断每行的一部分,并替换剩余的一些字符——以便将其格式化为命令行实用程序,当FIFO中的所有挂起行都被修改时,将调用该实用程序

我的输入可以如下所示:

[1466621350] PROCESS_SERVICE_CHECK_RESULT;rs301;Disk IOPS;0;No disks exceeds defined IOPS thresholds | sda=1.40;100;200 sdb=0.00;200;400 sdc=0.00;100;200 sdd=0.00;800;900 sde=0.00;800;900 sdf=0.40;200;3003
[1466621350] PROCESS_SERVICE_CHECK_RESULT;rs301a;Connectivity - Admin sessions;0;Connection OK |
[1466621350] PROCESS_SERVICE_CHECK_RESULT;rs301a;Uptime;0;Uptime ok - 253 days 07:53:49 |
[1466621350] PROCESS_SERVICE_CHECK_RESULT;rs301a;Volumes in pool;0;Number of volumes: 500 is OK | numvols=500
字符串的第一部分-直到第一个分号都应该删除-这将为我提供:

rs301;Disk IOPS;0;No disks exceeds defined IOPS thresholds | sda=1.40;100;200 sdb=0.00;200;400 sdc=0.00;100;200 sdd=0.00;800;900 sde=0.00;800;900 sdf=0.40;200;3003
rs301a;Connectivity - Admin sessions;0;Connection OK |
rs301a;Uptime;0;Uptime ok - 253 days 07:53:49 |
rs301a;Volumes in pool;0;Number of volumes: 500 is OK | numvols=500
因此,我需要用制表符替换前3个分号

我不是Perl正则表达式方面的专家,因此我不知道如何实现所需的输出

有人能帮我吗?我的脚本变量替换行应该是什么样子

我可以肯定,这是行不通的,因为它会替换所有分号:

$nsca_mystr=~s/\;/\t/g;

每行尝试以下操作:

$nsca_mystr =~ s/^(.+?);(.+?);(.+?);/$1\t$2\t$3\t/;

每行尝试以下操作:

$nsca_mystr =~ s/^(.+?);(.+?);(.+?);/$1\t$2\t$3\t/;
while(){
我的($line)=$\u=~/;(.*)/;\ fn捕获第一次之后的所有内容``
$line=~s/;/\t/代表1..3;#用``代替\t代表前3次出现的内容
打印“$line\n”;
}
while(){
我的($line)=$\u=~/;(.*)/;\ fn捕获第一次之后的所有内容``
$line=~s/;/\t/代表1..3;#用``代替\t代表前3次出现的内容
打印“$line\n”;
}

这就是我能想到的:

首先删除
“[146621350]流程服务…”“
部分

然后移除前3个
“;”

输出:

After regex : rs301     Disk IOPS       0       No disks exceeds defined IOPS thresholds | sda=1.40;100;200 sdb=0.00;200;400 sdc=0.00;100;200 sdd=0.00;800;900 sde=0.00;800;900 sdf=0.40;200;3003

这就是我能想到的:

首先删除
“[146621350]流程服务…”“
部分

然后移除前3个
“;”

输出:

After regex : rs301     Disk IOPS       0       No disks exceeds defined IOPS thresholds | sda=1.40;100;200 sdb=0.00;200;400 sdc=0.00;100;200 sdd=0.00;800;900 sde=0.00;800;900 sdf=0.40;200;3003
为了让意图更清楚,但这(理论上)会稍微慢一点,因为它捕获了4组而不是3组,并将第一组扔掉

为了让意图更清楚,但这(理论上)会稍微慢一点,因为它捕获了4组而不是3组,并将第一组扔掉

perl -p -e 's/^.+?;(.+?);(.+?);(.+?);/$1\t$2\t$3\t/;' < infile > outfile
perl -p -e 's/^(.+?);(.+?);(.+?);(.+?);/$2\t$3\t$4\t/;' < infile > outfile