10

我对此进行了很多搜索,但还没有找到答案,但我觉得我很接近了!

我在文本文件中有以下格式的日期:18/06/2012 23:00:43 (dd/mm/yyyy HH:MM:SS)我想转换为:2012-18-06 23:00:43 (yyyy-dd-mm HH:MM:SS)使用 Powershell。

要使用正则表达式在文本编辑器中执行转换,我会这样做:

Find: ([0-9]+)/+([0-9]+)/+([0-9]+)

Replace with: \3-\2-\1

因此,我尝试在以下 Powershell 脚本中使用相同的逻辑:

(Get-Content C:\script\test.txt) | 
Foreach-Object {$_ -replace "([0-9]+)/+([0-9]+)/+([0-9]+)", "(\3-\2-\1)"} | 
Set-Content C:\script\test.txt

但这会导致以下不良变化:

\3-\2-\1 23:00:43

任何人都可以帮我解决这个问题吗?

提前谢谢了!

4

3 回答 3

22

这就是你想要的:

(Get-Content C:\script\test.txt) | 
Foreach-Object {$_ -replace "([0-9]+)/+([0-9]+)/+([0-9]+)", '$3-$2-$1'} | 
Set-Content C:\script\test.txt

捕获组引用是使用$符号完成的,而不是反斜杠。此外,要按编号引用捕获的组,您必须在替换字符串周围使用单引号;否则,PowerShell 会将任何$符号解释为对先前定义的变量的引用,在这种情况下,这将导致字符串"--",因为不存在此类变量。

于 2012-06-20T15:35:55.143 回答
4

-replace 运算符支持与 .NET 中的 Regex.Replace() 函数相同的替换文本占位符。例如 $& 是整体正则表达式匹配,$1 是第一个捕获组匹配的文本,${name} 是命名组 "name" 匹配的文本

而不是"(\3-\2-\1)"使用'($3-$2-$1)'

'06/18/2012 23:00:43' -replace "(\d+)/(\d+)/(\d+)", '($3-$2-$1)'

于 2012-06-20T15:36:46.800 回答
2

尝试

Foreach-Object {$_-replace "([0-9]+)/+([0-9]+)/+([0-9]+)", '$3-$2-$1'}
于 2012-06-20T15:36:45.863 回答