2013-04-27 50 views
22

Tôi có một tệp văn bản đơn giản và tôi cần một tập lệnh PowerShell để thay thế một số phần của nội dung tệp.Thay thế nội dung của một tệp văn bản bằng một regex trong PowerShell

kịch bản hiện tại của tôi là như sau:

$content = Get-Content -path "Input.json" 

$content -Replace '"(\d+),(\d{1,})"', '$1.$2' | Out-File "output.json" 

Có thể viết nó trong một dòng mà không có sự biến nội dung, như thế này?

Get-Content -path "Input.json" | ??? -Replace '"(\d+),(\d{1,})"', '$1.$2' | Out-File "output.json" 

Tôi không biết cách sử dụng đầu ra của lệnh get-content đầu tiên trong lệnh thứ hai mà không có biến $ content? Có biến số quyền hạn tự động nào là

Có thể thực hiện thay thế nhiều hơn một trong một đường ống không.

Get-Content -path "Input.json" | ??? -Replace '"(\d+),(\d{1,})"', '$1.$2' | ??? -Replace 'second regex', 'second replacement' | Out-File "output.json" 

Trả lời

37

Vâng, bạn có thể làm điều đó trong một dòng và thậm chí không cần một đường ống, như -replace công trình trên các mảng như bạn mong chờ nó phải làm (và bạn có thể chuỗi các nhà điều hành):

(Get-Content Input.json) ` 
    -replace '"(\d+),(\d{1,})"', '$1.$2' ` 
    -replace 'second regex', 'second replacement' | 
    Out-File output.json 

(xuống dòng thêm vào cho dễ đọc.)

Dấu ngoặc xung quanh Get-Content gọi là cần thiết để ngăn chặn các nhà điều hành -replace được hiểu như là một cuộc tranh cãi để Get-Content.

+0

Cảm ơn bạn! Đó là điều tôi muốn! –

+0

Mặc dù nó chỉ hoạt động trên một dòng tại một thời điểm '" \ 'n", "b" -replace ('\ n', 'a') 'sẽ trả về 'a', 'b'. '" \ 'n", "b" -replace ('\ nb', 'a') 'Sẽ vẫn trả về" \ 'n", "b" –

+1

@TheRedPea: Bạn có thể làm điều đó với tất cả các dòng cùng một lúc bằng cách sử dụng Thay vào đó, 'Get-Content -Raw'. Sau đó bạn nhận được một chuỗi duy nhất trở lại. – Joey

4

Có thể viết nó trong một hàng không có biến nội dung, như thế này không?

Có: sử dụng ForEach-Object (hoặc bí danh của nó %) và sau đó $_ để tham khảo các đối tượng trên đường ống:

Get-Content -path "Input.json" | % { $_ -Replace '"(\d+),(\d{1,})"', '$1.$2' } | Out-File "output.json" 

Có thể làm nhiều hơn thay thế hơn một trong một đường ống.

Có.

  1. Như trên: chỉ cần thêm Foreach-Object phân đoạn.
  2. Như -replace lợi nhuận kết quả, họ có thể bị xiềng xích trong một biểu thức duy nhất:

    ($_ -replace $a,$b) -replace $c,$d 
    

    tôi nghi ngờ ngoặc không cần thiết, nhưng tôi nghĩ rằng họ làm cho nó dễ dàng hơn để đọc: rõ ràng nhiều hơn một vài các toán tử xích (đặc biệt nếu đối sánh/thay thế không quan trọng) không rõ ràng.

+0

Giải pháp của bạn chỉ hoạt động với các dấu ngoặc đơn xung quanh lệnh Get-Content. (Get-Content -path $ inputFile) | % {$ _ -Replace '"(\ d +), (\ d {1,})"', '$ 1. $ 2' -Đặt lại '"(\ d +)"', '$ 1' -Địa chỉ '_', ' '} | Out-File $ outputFile –

+2

@JanBaer Những dấu ngoặc đơn này chỉ cần thiết nếu '$ InputFile' giống với' $ OutputFile'. – Richard

+0

Bạn có bất kỳ tham chiếu nào về lý do tại sao dấu ngoặc đơn làm cho văn bản vào tệp đầu vào có thể không?Đây chính là trường hợp sử dụng tôi cần, nhưng tôi thấy nó không rõ ràng. –

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