2012-02-23 44 views
13

Đây là để đáp lại câu hỏi trước đây của tôi:PowerShell: Trích dẫn -replace & biến

PowerShell: -replace, regex and ($) dollar sign woes

Câu hỏi của tôi là: tại sao những 2 dòng mã có kết quả khác nhau:

'abc' -replace 'a(\w)', '$1' 
'abc' -replace 'a(\w)', "$1" 

VÀ theo 2 bài viết dưới đây, tại sao biến '$ 1' trong các dấu nháy đơn được sử dụng như một chuỗi ký tự bằng chữ? Tất cả mọi thứ trong dấu nháy đơn nên được coi là một chuỗi văn bản bằng chữ, phải không?

http://www.computerperformance.co.uk/powershell/powershell_quotes.htm
http://blogs.msdn.com/b/powershell/archive/2006/07/15/variable-expansion-in-strings-and-herestrings.aspx

Trả lời

18

Khi bạn sử dụng dấu nháy đơn bạn nói với PowerShell để sử dụng một chuỗi chữ tất cả mọi thứ có nghĩa là giữa khai mạc và bế quote là để được hiểu theo nghĩa đen.

Khi bạn sử dụng dấu ngoặc kép, PowerShell sẽ diễn giải các ký tự cụ thể bên trong dấu ngoặc kép.

Xem get-help about_quoting_rules hoặc nhấp vào here.

Ký hiệu đô la có ý nghĩa đặc biệt trong cụm từ thông dụng và trong PowerShell. Bạn muốn sử dụng dấu nháy đơn nếu bạn định sử dụng ký hiệu đô la làm cụm từ thông dụng.

Trong ví dụ của bạn, regex a(\w) khớp với chữ cái 'a' và sau đó là ký tự từ được chụp trong tham chiếu trở lại # 1. Vì vậy, khi bạn thay thế bằng $1, bạn sẽ thay thế văn bản phù hợp ab bằng tham chiếu trở lại phù hợp b. Vì vậy, bạn nhận được bc.

Trong ví dụ thứ hai của bạn bằng cách sử dụng dấu ngoặc kép, PowerShell diễn giải "$1" dưới dạng chuỗi có biến số $1 bên trong. Bạn không có biến có tên là $1 vì vậy nó không có giá trị. Vì vậy, các regex thay thế ab với null đó là lý do tại sao bạn chỉ nhận được c.

+1

(ánh sáng tắt trong đầu) Ma ny cảm ơn. Vâng giải thích. – Vippy

3

'$ 1' là sự phản hồi regex. Nó được tạo ra bởi các trận đấu regex, và nó chỉ tồn tại trong bối cảnh đó thay thế hoạt động. Nó không phải là một biến powershell.

"$ 1" sẽ được hiểu là biến Powershell. Nếu không có biến nào được gọi là $ 1, giá trị thay thế sẽ là null.

+0

Ngoài ra, cảm ơn thông tin chi tiết của bạn. Bất cứ điều gì giúp. – Vippy

11

Trong dòng thứ hai của bạn:

'abc' -replace 'một (\ w)', "$ 1"

Powershell thay thế $ 1 trước khi nó được cho là regex thay thế hoạt động, như những người khác đã nói.Bạn có thể tránh sự thay thế đó bằng cách sử dụng một backtick, như trong:

'abc' -replace 'một (\ w)', "` $ 1"

Vì vậy, nếu bạn đã có một chuỗi trong một tiền tố $ biến mà bạn muốn bao gồm trong chuỗi thay thế, bạn có thể sử dụng nó trong dấu ngoặc kép như sau:

'abc' -replace 'a (\ w)', "$ prefix` $ 1"

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