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 に答える