替换每行上的前x次出现

时间:2016-06-22 19:02:31

标签: 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;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

由此,我需要用TAB字符替换前3个分号。

我不是Perl正则表达式的专家 - 所以我不知道如何实现所需的输出。

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

我肯定知道,这不起作用,因为它取代了所有的分号:

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

4 个答案:

答案 0 :(得分:1)

animationDidStop

答案 1 :(得分:1)

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

这&#34;分裂&#34;输入线分为四个&#34;字段&#34;在前四个;并将其替换为由\t分隔的第二,第三和第四个字段。第一个字段被删除,剩余的文本(在第四个;之后)保持不变。

它也可以写成

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

使意图更清晰,但这将(理论上)稍微慢一点,因为它捕获了4组而不是3组,并抛弃了第1组。

答案 2 :(得分:0)

为每一行尝试此操作:

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

答案 3 :(得分:0)

这是我能想到的:

首先删除"[1466621350] PROCESS_SERVICE....."部分

然后删除前3个";"

#!/usr/bin/perl
use warnings;
my $line = "[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";


$line =~ s/[[\d]+]\s+PROCESS_SERVICE_CHECK_RESULT;//g;

print "After regex : ";
$line =~ s/(\w+);(\w+\s\w+);(\d+);(.*)/$1\t$2\t$3\t$4/g;
print $line;
print "\n";

输出:

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