(本記事はPowerShell入門記事としてコチラにもまとめています。)
ForEach-Objectを使って、複数のファイルを置換してみます。
まずは例によってランダムなファイル生成から。
PS C:\Users\takk\aaa> 1..6 | %{$n=1}{$r=random;$dir=$r -replace("(....)","$&\\");mkdir $dir | out-null;1..4 | % {echo $_" "$r >> $dir/file_$r.txt}}
PS C:\Users\takk\aaa>
このようなフォルダとファイルができました。
PS C:\Users\takk\aaa> ls -s -n -File 1009\7783\03\file_1009778303.txt 1140\3858\4\file_114038584.txt 1236\9624\05\file_1236962405.txt 1374\5229\22\file_1374522922.txt 8623\1718\5\file_862317185.txt 9398\6818\file_93986818.txt PS C:\Users\takk\aaa>
現在の各ファイルの内容は、このようになっています。
PS C:\Users\takk\aaa> ls -s -n -File | %{echo ===$_===;cat $_}
===1009\7783\03\file_1009778303.txt===
1 1009778303
2 1009778303
3 1009778303
4 1009778303
===1140\3858\4\file_114038584.txt===
1 114038584
2 114038584
3 114038584
4 114038584
===1236\9624\05\file_1236962405.txt===
1 1236962405
2 1236962405
3 1236962405
4 1236962405
===1374\5229\22\file_1374522922.txt===
1 1374522922
2 1374522922
3 1374522922
4 1374522922
===8623\1718\5\file_862317185.txt===
1 862317185
2 862317185
3 862317185
4 862317185
===9398\6818\file_93986818.txt===
1 93986818
2 93986818
3 93986818
4 93986818
PS C:\Users\takk\aaa>
では置換します。元のファイルは残したまま置換します。
二行目の末尾に印をつけます。
PS C:\Users\takk\aaa> ls -s -n -File | %{$fname=$_+".newfile";cat $_ | %{ $_ -creplace "^(2.*)$","$& <---" >> $fname}}
PS C:\Users\takk\aaa>
置換前のファイルに加えて、同じフォルダに、置換後のファイルができましたね。
PS C:\Users\takk\aaa> ls -s -n -File 1009\7783\03\file_1009778303.txt 1009\7783\03\file_1009778303.txt.newfile 1140\3858\4\file_114038584.txt 1140\3858\4\file_114038584.txt.newfile 1236\9624\05\file_1236962405.txt 1236\9624\05\file_1236962405.txt.newfile 1374\5229\22\file_1374522922.txt 1374\5229\22\file_1374522922.txt.newfile 8623\1718\5\file_862317185.txt 8623\1718\5\file_862317185.txt.newfile 9398\6818\file_93986818.txt 9398\6818\file_93986818.txt.newfile PS C:\Users\takk\aaa>
newfileで絞り込みます。
PS C:\Users\takk\aaa> ls -n -s -Filter *.newfile 1009\7783\03\file_1009778303.txt.newfile 1140\3858\4\file_114038584.txt.newfile 1236\9624\05\file_1236962405.txt.newfile 1374\5229\22\file_1374522922.txt.newfile 8623\1718\5\file_862317185.txt.newfile 9398\6818\file_93986818.txt.newfile PS C:\Users\takk\aaa>
各ファイルの内容はこのようになっています。2行目に印がつきました。
PS C:\Users\takk\aaa> ls -s -n -Filter *.newfile | %{echo ===$_===;cat $_}
===1009\7783\03\file_1009778303.txt.newfile===
1 1009778303
2 1009778303 <---
3 1009778303
4 1009778303
===1140\3858\4\file_114038584.txt.newfile===
1 114038584
2 114038584 <---
3 114038584
4 114038584
===1236\9624\05\file_1236962405.txt.newfile===
1 1236962405
2 1236962405 <---
3 1236962405
4 1236962405
===1374\5229\22\file_1374522922.txt.newfile===
1 1374522922
2 1374522922 <---
3 1374522922
4 1374522922
===8623\1718\5\file_862317185.txt.newfile===
1 862317185
2 862317185 <---
3 862317185
4 862317185
===9398\6818\file_93986818.txt.newfile===
1 93986818
2 93986818 <---
3 93986818
4 93986818
PS C:\Users\takk\aaa>


コメント
[…] ← PowerShell(複数ファイルの置換) […]