2012-04-26 3 views
1

詳細:sedまたはperlを使用してストリーム内の文字列の検索置換正規表現内の置換文字列内の一致(n番目の一致)のカウントを出力する方法はありますか?

私は

-f尾を使用して着信ストリーム内のファイルを読んでいる私は、SEDを使用して、ストリーム内の文字/文字列の検索と置換することができるよ、のようなもの:

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

これは、セパレータ文字列(この場合は印字不可能な16進数のnn、nnは05の場合があります。 tput)string | sep |。

| sepn |

だから私は、要件は、n番目の試合は(置換文字列でそのようにマークすることです、

のようなものは、私がしたいことはそう

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

あり得ますここでnはnoです。試合で作られた代替品の数を追跡するために、その場で交換を評価する)

答えて

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 

見ての通り、あなたがする必要があります手動で各行のセパレータカウンタをリセットします。

+0

... – user557060

+0

私は入力を分割している、私は避けたかったのか行うことを決めました私は分割して得られたフィールドを印刷する間に色分けされた印刷を使用して、異なる色のセパレータを追加することができました。 – user557060

+0

Term :: ANSIColorを使用していますか?ちょうど正規表現評価部分の中に "色付けされた"機能を挿入するのはなぜですか?色のエスケープコードを生成するだけです。すぐに印刷する必要はありません。 –

0

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

私は今、置換文字列に色情報を埋め込むための方法を見つけるのに苦労していますことを除いて、作品
gawk -F 'sep' '{ a=1;while (a <= NF) {printf("%d:%s",a,$a); a++}print}' 
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; 
    }