2012-06-20 34 views
9

Tôi đã thực hiện nhiều tìm kiếm về điều này và chưa tìm ra câu trả lời, nhưng tôi cảm thấy như tôi đã gần gũi!Cách thay thế ngày trong tệp văn bản bằng Powershell bằng cách sử dụng cụm từ thông dụng

Tôi có ngày trong tệp văn bản theo định dạng sau: 18/06/2012 23:00:43 (dd/mm/yyyy HH:MM:SS) mà tôi muốn chuyển đổi thành: 2012-18-06 23:00:43 (yyyy-dd-mm HH:MM:SS) bằng Powershell.

Để thực hiện việc chuyển đổi trong một trình soạn thảo văn bản sử dụng biểu thức thông thường tôi sẽ làm điều này:

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

Replace with: \3-\2-\1 

Vì vậy, tôi đã cố gắng sử dụng logic này tương tự trong một kịch bản Powershell sau:

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

nhưng dẫn đến thay đổi không mong muốn sau:

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

Ai cũng có thể giúp tôi làm móng tay này?

Rất cám ơn trước!

+0

Nếu bạn có một chuỗi ngày trong một số biến ($ ngày) sau đó định dạng lại nó một cách dễ dàng trong PowerShell: *** (Get-Date $ date) ToString ('yyyy-dd-MM HH: mm: ss') *** – EBGreen

Trả lời

21

Đây là những gì bạn muốn:

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

Chụp tham chiếu nhóm được thực hiện với sự $ biểu tượng, không phải là một dấu chéo ngược. Ngoài ra, để tham chiếu một nhóm được chụp theo số, you must use single quotes around the replacement string; nếu không, PowerShell sẽ giải thích bất kỳ biểu tượng $ nào làm tham chiếu đến biến được xác định trước đó, trong trường hợp này sẽ dẫn đến chuỗi "--" vì không có biến nào tồn tại.

+0

Cảm ơn Michael, nhưng tiếc là tôi vẫn nhận được kết quả: \ 3- \ 2- \ 1 23:00:43 với tập lệnh này. Tui bỏ lỡ điều gì vậy? – AshBestos

+0

@AshBestos: Bạn có nhớ lưu tập lệnh của mình sau khi sao chép tập lệnh này không? Đó là phỏng đoán đầu tiên của tôi. –

+0

Aha, tôi đã thực sự kiểm tra một tệp có tên text.txt trong một thư mục khác! Rất tiếc! cảm ơn rất nhiều về sự giúp đỡ của bạn. – AshBestos

2

thử

Foreach-Object {$_-replace "([0-9]+)/+([0-9]+)/+([0-9]+)", '$3-$2-$1'} 
+0

Cảm ơn Christian :) – AshBestos

Các vấn đề liên quan