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:将行拆分为多行[重复]的主要内容,如果未能解决你的问题,请参考以下文章