Reputation: 302
I've done much searching on this and haven't worked out the answer, but I feel like I am close!
I have dates in a text file in the following format: 18/06/2012 23:00:43 (dd/mm/yyyy HH:MM:SS)
which I want to convert to: 2012-18-06 23:00:43 (yyyy-dd-mm HH:MM:SS)
using Powershell.
To perform the conversion in a text editor using regular expressions I would do this:
Find: ([0-9]+)/+([0-9]+)/+([0-9]+)
Replace with: \3-\2-\1
So I have tried using this same logic in a the following Powershell script:
(Get-Content C:\script\test.txt) |
Foreach-Object {$_ -replace "([0-9]+)/+([0-9]+)/+([0-9]+)", "(\3-\2-\1)"} |
Set-Content C:\script\test.txt
but that results in the following undesired change:
\3-\2-\1 23:00:43
Can anybody help me nail this?
Many thanks in advance!
Upvotes: 10
Views: 13520
Reputation: 8679
The -replace operator supports the same replacement text placeholders as the Regex.Replace() function in .NET. E.g. $& is the overall regex match, $1 is the text matched by the first capturing group, and ${name} is the text matched by the named group "name".
Instead of "(\3-\2-\1)"
use '($3-$2-$1)'
'06/18/2012 23:00:43' -replace "(\d+)/(\d+)/(\d+)", '($3-$2-$1)'
Upvotes: 4
Reputation: 60918
try
Foreach-Object {$_-replace "([0-9]+)/+([0-9]+)/+([0-9]+)", '$3-$2-$1'}
Upvotes: 2
Reputation: 191895
This is what you want:
(Get-Content C:\script\test.txt) |
Foreach-Object {$_ -replace "([0-9]+)/+([0-9]+)/+([0-9]+)", '$3-$2-$1'} |
Set-Content C:\script\test.txt
Capturing group references are done with the $
symbol, not a backslash. Also, to reference a captured group by number, you must use single quotes around the replacement string; otherwise, PowerShell will interpret any $
symbol as a reference to a previously defined variable, which in this case will result in the string "--"
since no such variables exist.
Upvotes: 22