2012-08-26 53 views
2

我想爲我的輸入文件中的所有行編號,除此之外,它與我的正則表達式匹配。例如:如何在異常情況下編號行(bash或sed)

輸入文件:

some text 12345 
some another text qwerty 
my special line 
blah foo bar 

正則表達式:^我

輸出:

1 some text 12345 
2 some another text qwerty 
my special line 
3 blah foo bar 

回答

6

awk能做到這一點很容易地。 awk腳本:

!/^my/ { 
    cnt++; 
    printf "%d ", cnt 
} 
{ 
    print 
} 

這意味着:對於不表達匹配所有的線條,增加變量cnt(其中在零開始了),並打印隨後一個空格數。然後打印整行。

演示:

$ awk '!/^my/{cnt++; printf "%d ", cnt} {print}' input 
1 some text 12345 
2 some another text qwerty 
my special line 
3 blah foo bar 

壓縮版本由於Thor

$ awk '!/^my/{$0=++cnt" "$0} 1' input 

這是通過修改所述整行($0)時,線不匹配表達式(前面加上預增量計數器)。
1之後的第一個pattern{action}對本身是一個pattern{action}對,省略了動作部分。 1始終爲真,因此該操作始終執行,沒有指定時的默認操作是{print}。沒有參數列表的print相當於print $0,即打印整行。

+0

或者更短的:'!/^my/{$ 0 = ++ cnt「」$ 0} 1'' – Thor

+0

沒想過修改'$ 0',在這種情況下確實很好。如果有點神祕,孤立的'1'是一個有趣的捷徑。 – Mat

相關問題