【发布时间】: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。
【问题讨论】:
我有一个单词列表:
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
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
【讨论】:
-e/E 或 -n,它将解释为 xargs 默认回显的参数。
sed 示例对我不起作用,至少在 MacOS 上是这样。这代替了sed -e $'s/,/\\\n/g'(在这里找到:stackoverflow.com/a/18410122/4358405)
-e。谢谢你的信息,我已经用它更新了我的答案。
--output-delimiter 中需要美元符号?它在那里做什么?
--output-delimiter='\n',它将写入一个文字字符串“\n”而不是一个新行。 $'\n' 中的美元用于告诉命令不要按字面处理字符串。