nlコマンドは正規表現が利用でき、特定の条件に当てはまる行だけに行番号を出力することができます。利用できる正規表現はPOSIXの「基本正規表現(BRE)」です。
正規表現についての詳細は他の記事をご覧ください。
nl
での正規表現の使い方
前の記事にて紹介済みですので、coreutilsのものだけ一部引用します。
‘pBRE’
number only lines that contain a match for the basic regular
expression BRE. *Note Regular Expressions: (grep)Regular
Expressions.
-b pBRE
というように各-b
-h
-f
オプションのあとにパターン指定します。パターンに一致する行にだけ行番号が出力されるようになります。p
のあとにスペースを入れて-b p BRE
としてしまうと期待通りの動きをしませんので注意しましょう。
#正規表現を試してみる
正規表現が使えると自由度が高くなんでもできそうな気がしてきます。使いどころはわかりませんが、いくつか試してみます。
特定の文字種を含む行
$ echo -e 'aaa\n123\nbbb' | nl -b p'[0-9]'
aaa
1 123
bbb
$ echo -e 'aaa\n123\nbbb' | nl -b p'[[:alpha:]]'
1 aaa
123
2 bbb
同じ文字が連続する行
$ echo -e 'aaa\naba\nbbb' | nl -b p'\(.\)\1\{2\}'
1 aaa
aba
2 bbb
$ echo -e 'aaa\naba\nbbb' | nl -b p'\(.\)\1\1'
1 aaa
aba
2 bbb
特定の長さの行
$ echo -e 'aaa\naaaa\naaaaa\naaaaaa' | nl -b p'^.\{4,5\}$'
aaa
1 aaaa
2 aaaaa
aaaaaa
$ echo -e 'aaa\naaaa\naaaaa\naaaaaa' | nl -b p'^.\{4,\}$'
aaa
1 aaaa
2 aaaaa
3 aaaaaa
応用例
ごく一部のテキストあるいは特定条件でのみ番号を振りたい場合には活躍すると思いますが、自由度が高い一方で具体的な応用例はあまり思いつきません。例として論理ページの記事で利用した上野東京ラインのテキストデータ「utl-doc」を用いて、「フッターに配置された備考テキストが複数存在するときだけ番号を出力」してみます。
$ nl -f p: utl-doc
【東海道線(JT)】
1 東京
2 新橋
3 品川
4 川崎
5 横浜
6 戸塚
7 大船
大船以南、小田原方面へ直通
【宇都宮線・高崎線(JU)】
1 東京
2 上野
3 尾久
4 赤羽
5 浦和
6 さいたま新都心
7 大宮
1 宇都宮線: 大宮以北、宇都宮方面へ直通
2 高崎線: 高崎方面へ直通
東海道線の備考テキスト「大船以南〜」には番号が振られませんが、分岐する宇都宮線と高崎線には番号が振られました。この例では、路線名の後の「:」を正規表現のパターンに指定しています。-s
や-w
もセクションごとに指定できるともう少し便利そうですが、そういった使い方は想定されていないようです。