Разделите строку с помощью PowerShell и сделайте что-нибудь с каждым токеном
я хочу разделить каждую линию трубы на пробелы, а затем распечатать каждый элемент на отдельной строке.
я понимаю, что могу получить этот результат, используя:
(cat someFileInsteadOfAPipe).split(" ")
но я хочу больше гибкости. Я хочу быть в состоянии сделать почти все с каждым маркером. (Я использовал AWK на UNIX, и я пытаюсь получить ту же функциональность.)
в настоящее время у меня есть:
echo "Once upon a time there were three little pigs" | %{$data = $_.split(" "); Write-Output "$($data[0]) and whatever I want to output with it"}
, который, очевидно, печатает только первый знак. Есть есть способ для меня-каждый над жетонами, печатая каждый по очереди?
и %{$data = $_.split(" "); Write-Output "$($data[0])"}
часть я получил из блога, и я действительно не понимаю, что я делаю или как работает синтаксис.
я хочу погуглить для него, но я не знаю, как это назвать. Пожалуйста, помогите мне со словом или двумя в Google, или ссылку, объясняющую мне, что такое %
и $
символы делают, а также Значение открывающих и закрывающих скобок.
I поймите, я не могу на самом деле использовать (cat someFileInsteadOfAPipe).split(" ")
, так как файл (или предпочтительный входящий канал) содержит более одной строки.
относительно некоторых ответов:
если вы используете Select-String
чтобы отфильтровать вывод перед токенизацией, нужно иметь в виду, что вывод Select-String
команда-это не набор строк, а набор MatchInfo
объекты. Чтобы добраться до строки, которую вы хотите разделить, вам нужно получить доступ к Line
свойства MatchInfo
объект, вроде так:
cat someFile | Select-String "keywordFoo" | %{$_.Line.Split(" ")}
3 ответа:
"Once upon a time there were three little pigs".Split(" ") | ForEach { "$_ is a token" }
ключ
$_
, что означает текущую переменную в конвейере.о коде, который вы нашли в интернете:
%
псевдонимForEach-Object
. Все, что заключено в скобки, выполняется один раз для каждого объекта, который он получает. В этом случае он запускается только один раз, потому что вы отправляете ему одну строку.
$_.Split(" ")
принимает текущую переменную и разбивает ее на пробелы. Текущая переменная будет все зациклено наForEach
.
дополнить полезный ответ Юстуса Тейна:
как Джой примечания в комментарии PowerShell имеет мощное регулярное выражение
-split
оператор.
- в своем унарный форма (
-split '...'
),-split
ведет себя какawk
's разделение полей по умолчанию, что означает, что:
- начальные и конечные пробелы игнорируемый.
- любой выполнить пробелов (например, несколько смежные пространства) рассматривается как один разделитель.
на PowerShell v4 выражение на основе - и, следовательно, быстрее -альтернатива
ForEach-Object
стало доступно: the.ForEach()
коллекция "оператор" (метод), как описано в этот блог пост (рядом с.Where()
метод, более мощная, основанная на выражении альтернативаWhere-Object
).вот решение, основанное на этих особенностях:
PS> (-split ' One for the money ').ForEach({ "token: [$_]" }) token: [One] token: [for] token: [the] token: [money]
обратите внимание, что начальные и конечные пробелы игнорируются, и что несколько пробелов между
One
иfor
были обработаны как одиночный разделитель.
еще один способ добиться этого-это сочетание ответов Юстуса Тейна и mklement0. Это не имеет смысла делать это таким образом, когда вы смотрите на один пример лайнера, но когда вы пытаетесь массово редактировать файл или кучу имен файлов, это очень удобно:
$test = ' One for the money ' $option = [System.StringSplitOptions]::RemoveEmptyEntries $($test.split(' ',$option)).foreach{$_}
это будет выглядеть так:
One for the money