この文字列はいったい何行目に書かれているのだろうか、という話です。例えば、3行目から7行目まで処理をしたい、となった時に、その行数を指定するときに使えるかなと。あらかじめ検索する文字列がわかっている場合に限るが。
対象文字列を含んだ行数を取得
以下のテストデータを使用します。
1 2 3 4 5 6 |
> Get-Content .\test.txt テキスト1行目 テキスト2行目 テキスト3行目 テキスト4行目 テキスト5行目 |
まず、対象行のみ抜き出してみます。
1 2 3 |
> Select-String -Pattern "1行目" .\test.txt -Encoding default test.txt:1:テキスト1行目 |
よくわからないので、全行を select-string で表示させてみます。ちなみに -Pattern は付けなくでもいける。
1 2 3 4 5 6 7 |
> Select-String "行目" .\test.txt -Encoding default test.txt:1:テキスト1行目 test.txt:2:テキスト2行目 test.txt:3:テキスト3行目 test.txt:4:テキスト4行目 test.txt:5:テキスト5行目 |
select-string コマンドレットの表示は、以下のようになるので「:」区切りで2つめを取り出せればよさそうです。
ファイル名:行数:本文
試しに3行目を抜き出してみます。
1 2 |
> Select-String "3行目" .\test.txt -Encoding default | ForEach-Object { $($_ -split":")[2] } 3 |
説明
- -Encoding default は文字コードを指定(default は SJIS)
- -split で区切り文字を指定します。
- [n] で左から何個目かを指定します。
これ、実はすんなりうまくいったように見えるが、[n] は 0 から数えます。↑では [2] を指定しているので、実は3つ目を取ってきている。
実際にやってみると以下。
1 2 3 4 5 6 7 8 9 10 11 |
> Select-String "3行目" .\test.txt -Encoding default | ForEach-Object { $($_ -split":")[0] } C > Select-String "3行目" .\test.txt -Encoding default | ForEach-Object { $($_ -split":")[1] } \work\test.txt > Select-String "3行目" .\test.txt -Encoding default | ForEach-Object { $($_ -split":")[2] } 3 > Select-String "3行目" .\test.txt -Encoding default | ForEach-Object { $($_ -split":")[3] } テキスト3行目 |
以上です。
↓↓↓ 持っていると便利な一冊。