Разделите строку с помощью 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 52

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