O Windows 7 vem com o PowerShell v2, que suporta expressões regulares com atrasos negativos.
Se eu interpretar o seu RegEx corretamente, você deseja aplicar os dois dígitos 99_
que levam o segundo campo a ser exibido também o terceiro campo, desde que ainda não exista um _99
number. E deixe as outras linhas / restante da linha como é.
Um arquivo em lotes que atua como um destino de descarte (também manipula vários arquivos):
:: SO_1352996.cmd
@Echo off
:Loop
If "%~1" equ "" goto :Eof
If not exist "%~1" (shift & goto :Loop)
Ren "%~f1" "%~n1_Original%~x1"
:: Use PowerShell as a tool to do the replace.
Powershell -NoP -C "(Get-Content '%~dpn1_Original%~x1') -replace '^([^,]*,(\d\d)_[^,]*,[^,]*)(?<!_\d\d),','$1_$2,' | Set-Content '%~f1'
Shift
Goto :Loop
arquivo.csv antes
test,12_blah,blubb,anything
test,34_blah,blu_34,doesn't matter
test,56_foo,bar,nevermind
e depois de cair no lote acima.
test,12_blah,blubb_12,anything
test,34_blah,blu_34,doesn't matter
test,56_foo,bar_56,nevermind
O arquivo original é salvo com a extensão adicional .bak