2017-01-09 2 views
1

Скажем у вас есть ЗШ массив как:Как можно преобразовать элементы массива zsh в одно расширение?

a=("x y" "v w") 

Я хочу взять первое слово каждого элемента, скажем:

b=() 
for e in $a; { 
    b=($b $e[(w)0]) 
} 

Так что теперь у меня есть то, что мне нужно в Ъ:

$ print ${(qq)b} 
'x' 'v' 

Есть ли способ сделать это в одном выражении расширения? (то есть не нужен цикл for для обработки каждого элемента массива и накопления результата в новом массиве).

ответ

2

Это может быть возможным, чтобы взять слово, удаляя из первого появления пустого пространства до конца в каждом элементе массива, как это:

$ print ${(qq)a%% *} 
'x' 'v' 

Это coulde Следует отметить, что %% выражения (и некоторые другие) могут быть использованы для элементов массива:

в следующих выражениях, когда имя является массивом и замена не цитируемым, или если «(@)» флаг или синтаксис name[@] используется, совпадающих и замена выполняется на каждый элемент массива отдельно.
...

${name%pattern}
${name%%pattern}

Если шаблон соответствует концу значения имени, то подставить значение имени с согласованной части удалены; в противном случае просто замените значение имени. В первой форме предпочтительна наименьшая совпадающая комбинация; во второй форме предпочтительной является наибольшая совпадающая картина.

- zshexpn(1): Expansion, Parameter Expansion

+0

Спасибо! Это работает! –

Смежные вопросы