转换以空格分隔的列表 - 将每个项目放在新行上并在其前面加上连字符

Transofrming a list separated with spaces - putting each item on a new line and prepending it with a hyphen

我有一个由 spaces

分隔的字符串记录列表
words="foo bar baz"

我想漂亮地打印它们,每一个都在一个新行上,并在前面加上一个连字符:

- foo
- bar
- baz

我怎样才能做到这一点?

我找到了很多用换行符替换 space 的方法,例如

tr ' ' '\n' <<< $words

但我没有运气将它们与连字符和 space 一起应用...出于某种原因,以下两行 return 相同的结果:

tr ' ' '\n' <<< $words
tr ' ' '\n- ' <<< $words

我在第一项前面加上 "- " 时也遇到了问题,而没有在我的控制台输出中换行。

sed 看起来不错:

sed 's/ /\n- /g; s/^/- /' <<<"$words"

或:

tr ' ' '\n' <<< $words | sed 's/^/- /'

如果$words是由空格分隔的简单单词,没有像*?[这样的花哨字符,你可以

printf -- "- %s\n" $words

请注意,未引用的变量扩展会进行分词 文件名扩展。

可以

words="foo bar baz";b=( $words );for i in ${!b[@]}; do echo "- ${b[$i]}";done

一系列 sed 命令可以做到:

sed 's/.*="//; s/"$//; s/ /\n/g;' <test | sed 's/^/- /'

编辑:糟糕,我以为 words="foo baz bar" 是文件的内容... @KamilCuk 有一个更简洁的方法。

awk:

awk 'BEGIN {RS=" "} {print "- " [=10=]}' <<< "${words}"

zsh 的一个版本,建立在其他一些答案和评论的基础上:

printf -- '- %s\n' ${=words}

zsh中,这个可以处理特殊字符,比如通配符:

% words="foo? 'b'ar *bar b[a-z]"
% printf -- '- %s\n' "${=words}"
- foo?
- 'b'ar
- *bar
- b[a-z]