我有一列单词:
aaaa bbbb ccc dddd
eee fff ggg hhh
iii jjj kkk
我希望每个词都在单独的一行中:
aaaa
bbbb
ccc
dddd
eee
fff
ggg
hhh
iii
jjj
kkk
如何用 Bash 以最少的字符数实现该操作?最好不要使用 awk。
纯 bash 实现:
while IFS=" " read -r -a line
do
printf "%s\n" "${line[@]}"
done < file
请参见:
$ while IFS=" " read -r -a line; do printf "%s\n" "${line[@]}"; done < file
aaaa
bbbb
ccc
dddd
eee
fff
ggg
hhh
iii
jjj
kkk
< p> 使用xargs
:
xargs -n 1 < file
使用 awk
:
awk '{for(i=1;i<=NF;i++) print $i}' file
awk -v OFS="\n" '$1=$1' file
使用 GNU sed
:
sed 's/ /\n/g' file
使用操作系统的sed
命令:
sed $'s/ /\\\n/g' file
使用 cut
命令:
cut -d' ' --output-delimiter=$'\n' -f1- file
使用 grep
命令:
grep -o '[^ ]\+' file
grep -Po '[^\s]+' file
sed
的例子在我的 MacOS 上无法工作。我使用了这个命令sed -e $'s/,/\\\n/g'
(来源:https://dev59.com/PWgv5IYBdhLWcg3wPObz#18410122),它可以正常工作。 - TMG-e
。感谢提供信息,我已经更新了我的回答。 - fedorqui--output-delimiter
中需要美元符号?它在那里起什么作用? - Asclepius--output-delimiter='\n'
,它会写入一个字面上的字符串"\n"而不是一个新行。在$'\n'
中的美元符号用于告诉命令不要将该字符串作为字面意义对待。 - fedorqui