Bash:将一行拆分为多行

7

我有一列单词:

aaaa bbbb ccc dddd
eee fff ggg hhh
iii jjj kkk

我希望每个词都在单独的一行中:

aaaa
bbbb
ccc
dddd
eee
fff
ggg
hhh
iii
jjj
kkk

如何用 Bash 以最少的字符数实现该操作?最好不要使用 awk。
1个回答

22

纯 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

1
请注意,xargs答案不会打印任何echo标志,例如,如果文件包含“-e / E”或“-n”,它将将其解释为xargs的默认echo参数。 - 123
sed 的例子在我的 MacOS 上无法工作。我使用了这个命令 sed -e $'s/,/\\\n/g'(来源:https://dev59.com/PWgv5IYBdhLWcg3wPObz#18410122),它可以正常工作。 - TMG
1
@TMG 是的!实际上你不需要 -e。感谢提供信息,我已经更新了我的回答。 - fedorqui
为什么在 --output-delimiter 中需要美元符号?它在那里起什么作用? - Asclepius
@Asclepius 因为如果我们单独使用--output-delimiter='\n',它会写入一个字面上的字符串"\n"而不是一个新行。在$'\n'中的美元符号用于告诉命令不要将该字符串作为字面意义对待。 - fedorqui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接