Соединить линии из трубы

В Bash есть команда вставки, которая может объединять строки из стандартного ввода.

$ { echo foo; echo bar; echo baz; } | paste -s -d ,
foo,bar,baz

Учитывая эту команду PowerShell

& { echo foo; echo bar; echo baz; }

Я хотел бы подключиться к чему-то, что создаст тот же результат. Я пробовал с Write-Host, но опция Separator была проигнорирована.

PS > & { echo foo; echo bar; echo baz; } | write-host -NoNewline -Separator ','
foobarbaz

person Steven Penny    schedule 05.12.2014    source источник


Ответы (3)


Если вы не можете найти командлет Powershell, который будет делать именно то, что вам нужно, вы всегда можете создать свой собственный:

function paste ($separator = ',') {$($input) -join $separator}
& { echo foo; echo bar; echo baz; } | paste

foo,bar,baz
person mjolinor    schedule 05.12.2014

Есть оператор -join, но его нужно использовать так:

(& { echo foo; echo bar; echo baz; }) -join ","

На самом деле вы никуда не передаете вывод. Просто сначала собираем результат, а потом присоединяемся.

Вы также можете сделать это с помощью ForEach-Object, если вы действительно хотите передать это, но это немного многословно:

& { echo foo; echo bar; echo baz; } | foreach -Begin { $res = @() } { $res += $_ } -End { $res -join "," }
person Mike Zboray    schedule 05.12.2014
comment
вот немного более упрощенное использование -join @( echo foo; echo bar; echo baz ) -join "," - person kevmar; 06.12.2014
comment
@kevmar Я предполагаю, что в реальном случае ОП вызывает функцию или скрипт. Пример — это просто способ вывода в конвейер. Применение моего предложения к более реалистичному случаю будет выглядеть примерно так (invoke-myfunction -parameter 1) -join ",". - person Mike Zboray; 06.12.2014

Write-Host (& { echo foo; echo bar; echo baz; }) -Separator ","

или более явно:

[string[]]$myvariable = (& { echo foo; echo bar; echo baz; })
Write-Host $myvariable -Separator ","
person DanL    schedule 05.12.2014