2012-07-05 24 views
50

Tôi muốn chia từng dòng của một đường ống trên không gian và sau đó in từng mã thông báo trên một dòng riêng.Tách chuỗi bằng PowerShell và làm điều gì đó với mỗi mã thông báo

Tôi nhận ra rằng tôi có thể có được kết quả này sử dụng:

(cat someFileInsteadOfAPipe).split(" ") 

Nhưng tôi muốn linh hoạt hơn. Tôi muốn có thể làm bất cứ thứ gì với mỗi mã thông báo. (Tôi sử dụng để sử dụng AWK trên Unix, và tôi đang cố gắng để có được những chức năng tương tự.)

Tôi hiện có:

echo "Once upon a time there were three little pigs" | %{$data = $_.split(" "); Write-Output "$($data[0]) and whatever I want to output with it"} 

nào, rõ ràng, chỉ in những dấu hiệu đầu tiên. Có cách nào cho tôi để cho mỗi lần trên các thẻ, in mỗi lần lượt?

Ngoài ra, phần %{$data = $_.split(" "); Write-Output "$($data[0])"} tôi nhận được từ blog và tôi thực sự không hiểu những gì tôi đang làm hoặc cách cú pháp hoạt động.

Tôi muốn google cho nó, nhưng tôi không biết phải gọi nó là gì. Hãy giúp tôi với một hoặc hai từ cho Google hoặc liên kết giải thích cho tôi những gì % và tất cả các biểu tượng $ cũng như ý nghĩa của dấu ngoặc mở và đóng.

Tôi nhận ra rằng tôi không thể thực sự sử dụng (cat someFileInsteadOfAPipe).split(" "), vì tệp (hoặc ống đến thích hợp) chứa nhiều hơn một dòng.

Về một số các câu trả lời:

Nếu bạn đang sử dụng Select-String để lọc đầu ra trước khi tokenizing, bạn cần phải ghi nhớ rằng đầu ra của lệnh Select-String không phải là một tập hợp các chuỗi, nhưng một bộ sưu tập MatchInfo đối tượng. Để có được chuỗi bạn muốn chia, bạn cần truy cập vào Line tài sản của đối tượng MatchInfo, như vậy:

cat someFile | Select-String "keywordFoo" | %{$_.Line.Split(" ")} 

Trả lời

100
"Once upon a time there were three little pigs".Split(" ") | ForEach { 
    Write-Host "$_ is a token" 
} 

Điều quan trọng là $_, viết tắt của biến hiện nay trong các đường ống.

Về mã bạn tìm thấy trực tuyến:

% là một bí danh cho ForEach-Object. Bất cứ điều gì kèm theo bên trong dấu ngoặc đơn được chạy một lần cho mỗi đối tượng nó nhận được. Trong trường hợp này, nó chỉ chạy một lần, bởi vì bạn đang gửi nó một chuỗi duy nhất.

$_.Split(" ") đang lấy biến hiện tại và chia nó trên không gian. Biến hiện tại sẽ là bất kỳ thứ gì hiện đang được lặp qua bởi ForEach.

+1

aaaah, cảm ơn bạn đã chỉnh sửa. Biết rằng '%' là viết tắt của 'foreach-object' có nghĩa là tôi có thể làm điều này cho nhiều dòng:' cat. \ Tmp.txt | % {$ _. Tách ("")} | % {Write-Output "$ ($ _) hello"} 'Đã giải quyết được vấn đề. –

+2

Hoàn hảo! Mừng vì tôi có thể giúp. Phần cuối cùng của lệnh của bạn có thể thực sự chỉ là '" $ _ hello "'. Bạn chỉ cần sử dụng ký hiệu $ ($ variable) nếu bạn đang cố mở rộng giá trị của thuộc tính của đối tượng bên trong một chuỗi. Ví dụ '' Tên cuối cùng của tôi là $ ($ person.surname). "' Hoặc đầu ra của một phương thức cmdlet: '" Ngày mai là $ ((Get-Date) .AddDays (1)) "'. –

+11

Chỉ cần lưu ý: Kể từ PowerShell v2, có một toán tử '-split' có thể được sử dụng để phân chia trên khoảng trắng nói chung (' -split $ foo') hoặc tương tự với '.Tách ('') ':' $ foo -split '' '. – Joey

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