转换以空格分隔的列表 - 将每个项目放在新行上并在其前面加上连字符
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]
我有一个由 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]