У меня была такая же проблема в оболочке strict posix. Я сделал это за два прохода с неиспользованным символом
cat data.json|tr '§' '?'|sed -e 's/"[^"]":/§&/g'|tr '§' '\n'
fpath
— это массив. Вы не должны пытаться понизить его до строки, а затем заменить в ней символы на символы новой строки.
Сksh
-подобным синтаксисом расширения массива:
$ printf '%s\n' "${fpath[@]}"
/usr/local/share/zsh/site-functions
/usr/share/zsh/site-functions
/usr/share/zsh/5.7.1/functions
С помощью zsh
вы также можете использовать "$fpath[@]"
или "${(@)fpath}"
.
Вы также можете:
$ printf '%s\n' $fpath
/usr/local/share/zsh/site-functions
/usr/share/zsh/site-functions
/usr/share/zsh/5.7.1/functions
Но учтите, что он пропускает пустые элементы массива (, скорее всего, это не проблема для$fpath
).
zsh
print
также может печатать элементы по одному в строке с опцией -l
. Как и в ksh
, откуда исходит встроенная функция print
, вам нужна опция -r
, чтобы печатать произвольные необработанные данные, поэтому:
print -rl -- $fpath
будет эквивалентно стандартному printf '%s\n'
.
Они отличаются от -C1
, когда $fpath
является пустым списком, и в этом случае print -rC1 -- $fpath
ничего не выводит, а print -rl
и printf '%s\n'
выводят одну пустую строку, поэтому
print -rC1 -- "$array[@]"
, вероятно, ближе всего к тому, что вы хотите печатать элементы массива по одному в строке, которые в bash
/ksh
вы могли бы написать:
[ "${#array[@]}" -eq 0 ] || printf '%s\n' "${array[@]}"