ファイル内の特定の文字列が記載された行を丸ごと削除する方法を備忘録を兼ねて紹介します。
何回も言っている気がするが、sed や awk なら簡単にできるのに。と思いながら Powershell とたわむれるエントリです。
特定の文字列が記載された行を丸ごと削除
丸ごとというところがキモだと思ってます。詳細は以下で。
やり方の概要
以下のイメージで処理をしていきます。
- データを変数に格納
- 特定の文字列が記載された行数を特定
- 対象行を削除(変数)
- 削除された状態が格納されている変数の内容を対象ファイルへ出力
同名ファイルを指定すれば上書き、別ファイル名を指定してもOK
やり方の詳細
以下のテストデータを使用します。今回は以下の"ghi"が記載された行を削除します。
1 2 3 4 5 6 |
PS > cat .\data.txt abc def ghi jkl mno |
まず、データを変数に格納します。
1 2 3 4 5 6 7 |
PS > $data = Get-Content .\data.txt PS > $data abc def ghi jkl mno |
次に、対象行(ghi)の行数を確認します。
1 2 |
PS > Select-String ghi .\data.txt | ForEach-Object { $($_ -split":")[2]} 3 |
これで、ghi が記載された行は、3行目ということがわかりました。
やっていることとしては、文字列「ghi」を select-string で 抜き出して、その結果を「:」区切りで3つ目のデータを取得しています。詳しくは以下のエントリにまとめています。
念のため、指定行のデータが対象のデータであることを確認してみます。$data の後に指定する [N] は0から数えるので、3行目の場合は2を指定します。
1 2 |
PS > $data[2] ghi |
続いて、対象行を削除して、削除されたことを確認します。
1 2 3 4 5 6 |
PS > $data[2] = $null PS > $data abc def jkl mno |
最後に、削除された状態が格納されている $data の内容を対象ファイルへ出力します。同名ファイルを指定すれば上書きです。ファイル名を変えれば別のファイルに保存します。
1 2 3 4 5 6 |
PS > $data | Out-File .\data.txt PS > cat .\data.txt abc def jkl mno |
おまけ
丸ごと削除する方法を紹介しましたが、単純に文字列を削除したいだけなら以下でいけます。ファイルへの保存のしかたは変数に入れてからの出力でいけます。
ただ、この場合、行は残ってしまうので、行ごと削除する場合はnullを使用する必要があると思います。他に良い方法があれば教えてください><
1 |
PS > Get-Content .\data.txt | ForEach-Object { $_ -replace "ghi","" } |
まとめ
使いづらいと言われているPowershell ですが、普段使いはやっぱりWindowsなので簡単なテキスト整形なんかは Powershell でさくっとできると重宝されるかも。無理してシェル芸人を目指す必要はないと思うけど、できるにこしたことはないよね。
ではまた次回。
↓↓↓ Powershell のおすすめレシピ