Powershell 特定の文字列を含むテキストファイルの行を入れ替える






特定の文字列を含むテキストファイルの行を一括で入れ替えるPowershellスクリプト。

「KEYWORD」という文字列を含む行を「testtesttesttesttesttest」という行に入れ替える。

対象のテキストファイルは、C:\temp\powershell\test-data.txt

$filepath = "C:\temp\powershell\test-data.txt"

$file = Get-Content -Path $filepath

$afterline = "testtesttesttesttesttest"

$match_list = Select-String "KEYWORD" $filepath | ForEach-Object { $($_ -split":")[2] }

	foreach ($line in $match_list) {
		$file[$line-1] = $afterline
		$file | Out-File $filepath
	}


スクリプト実行前のC:\temp\powershell\test-data.txt
00000000000000000000000000000000
11111111111111111111111111111111
222222222222222222222KEYWORD2222
33333333333333333333333333333333
44444444444444444444444444444444
55555555555555555555555555555555
66666666666666666666666666666666
77777KEYWORD77777777777777777777
88888888888888888888888888888888
99999999999999999999999999999999

スクリプト実行後のC:\temp\powershell\test-data.txt
00000000000000000000000000000000
11111111111111111111111111111111
testtesttesttesttesttest
33333333333333333333333333333333
44444444444444444444444444444444
55555555555555555555555555555555
66666666666666666666666666666666
testtesttesttesttesttest
88888888888888888888888888888888
99999999999999999999999999999999

Get-Contentでファイルを$fileに読み込むと、
一行ずつが$fileの一つの配列の要素として取り込まれる。
Select-Stringで文字列を検索して対象の行番号(配列番号)を取得して、
対象の配列の内容を置き換えている。

検索対象の文字列には、「<」や「>」なども指定可能。

配列の開始番号は0で、
行の開始番号は1なので、
文字列を検索して出力された行番号から1をマイナスすることで、
配列の指定を調整している。