LoginSignup
0
0

More than 3 years have passed since last update.

nlコマンドでの正規表現の利用

Last updated at Posted at 2020-12-10

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もセクションごとに指定できるともう少し便利そうですが、そういった使い方は想定されていないようです。


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0