1

詳細:

tail-fを使用して着信ストリームのファイルを読み取っています

sedを使用して、ストリーム内の文字/文字列を検索して置き換えることができます。

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

上記の結果は、区切り文字列の明確な視覚的マーカーを提供することです(この場合、印刷できない16進文字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

これが役立つかどうかを確認してください。(g)awkで。

gawk -F 'sep' '{ a=1;while (a <= NF) {printf("%d:%s",a,$a); a++}print}'
于 2012-04-26T10:08:11.240 に答える
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 に答える