Bash:将行拆分为多行[重复]

Posted

技术标签:

【中文标题】Bash:将行拆分为多行[重复]【英文标题】:Bash: split line into multiple lines [duplicate] 【发布时间】:2016-08-09 21:55:10 【问题描述】:

我有一个单词列表:

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】:

使用纯 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

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

【讨论】:

请注意,xargs 答案不会打印任何回显标志,例如,如果文件包含 -e/E-n,它将解释为 xargs 默认回显的参数。 sed 示例对我不起作用,至少在 MacOS 上是这样。这代替了sed -e $'s/,/\\\n/g'(在这里找到:***.com/a/18410122/4358405) @TMG 是的!事实上你不需要-e。谢谢你的信息,我已经用它更新了我的答案。 为什么--output-delimiter 中需要美元符号?它在那里做什么? @Asclepius 因为如果我们单独使用--output-delimiter='\n',它将写入一个文字字符串“\n”而不是一个新行。 $'\n' 中的美元用于告诉命令不要按字面处理字符串。

以上是关于Bash:将行拆分为多行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将行拆分为多行 Oracle

根据持续时间将行拆分为多行

熊猫:将列中的列表拆分为多行[重复]

基于逗号将行拆分为多行:一个班轮解决方案

将一串空格分隔的单词拆分为多行[重复]

在Bash中将字符串拆分为多个变量[重复]