1

细节:

我正在使用 tail -f 读取传入流中的文件

我可以使用 sed 在流中查找和替换字符/字符串,例如:

tail -f a.log | sed 's/'`echo -e "\xnn"`'/'`echo "$(tput setaf 1)|sep|$(tput sgr0)"`'/g'

以上实现的是为分隔符字符串提供了一个清晰的视觉标记(在这种情况下是不可打印的十六进制字符 nn,例如 nn 可能是 05,将其替换为红色(在这种情况下)颜色(通过 tput ) 字符串 |sep|。

所以我得到类似的东西

field **|sep|** field **|sep|** field **|sep|**

我想要的是

field **|sep#1|** field **|sep#2|** field **|sep#3|**

因此,要求是在替换字符串中将第 n 个匹配标记为这样(|sepn| 其中 n 是遇到的匹配数)

4

3 回答 3

3

使用 Perl 动态评估替换的能力来跟踪所做的替换次数:

my $str='field **|sep|** field **|sep|** field **|sep|**';
my $str2='saodifuasd|sep|psaoidugfsdoif|sep|sdoiufd';
my $cnt;
$cnt=0; $str=~s/\|sep\|/"|sep#".$cnt++."|"/ge;
$cnt=0; $str2=~s/\|sep\|/"|sep#".$cnt++."|"/ge;
print "$str\n";
print "$str2\n";

结果:

field **|sep#0|** field **|sep#1|** field **|sep#2|**
saodifuasd|sep#0|psaoidugfsdoif|sep#1|sdoiufd

如您所见,您必须在每一行上手动重置分隔符计数器。

于 2012-04-26T09:38:52.077 回答
0
    #! /usr/bin/perl
    #sed 's/'`echo -e "\x05"`'/'`echo "$(tput setaf 1)|sep|$(tput sgr0)"`'/g'
    use warnings;
    use strict;
    use Term::ANSIColor;
    use Term::ANSIColor qw(:constants);

    while(<>) {
    my $count=1;
    #s/\x05/"|#".$count++."|"/ge;
    s/\x05/colored("|#".$count++."|", 'RED')/ge;
    print;
    }
于 2012-04-27T12:55:08.017 回答
0

检查这是否有帮助,它在 (g)awk 中。

gawk -F 'sep' '{ a=1;while (a <= NF) {printf("%d:%s",a,$a); a++}print}'
于 2012-04-26T10:08:11.240 回答