(本記事は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(複数ファイルの置換) […]