Bash: 将一行拆分为多行

36 浏览
0 Comments

Bash: 将一行拆分为多行

我有一个带有多行单词的列表:\n

aaaa bbbb ccc dddd
eee fff ggg hhh
iii jjj kkk

\n我想将每个单词放在单独的一行上:\n

aaaa
bbbb
ccc
dddd
eee
fff
ggg
hhh
iii
jjj
kkk

\n如何在bash中以最少的字符数实现?最好不要使用awk。

0
0 Comments

问题的出现原因是需要将一行文本拆分成多行。解决方法有以下几种:

1. 使用纯Bash:

while IFS=" " read -r -a line
do
    printf "%s\n" "${line[@]}"
done < file

2. 使用xargs:

xargs -n 1 < file

3. 使用awk:

awk '{for(i=1;i<=NF;i++) print $i}' file

或者

awk -v OFS="\n" '$1=$1' file

4. 使用GNU sed:

sed 's/ /\n/g' file

5. 使用OS sed:

sed $'s/ /\\\n/g' file

6. 使用cut:

cut -d' ' --output-delimiter=$'\n' -f1- file

7. 使用grep:

grep -o '[^ ]\+' file

或者

grep -Po '[^\s]+' file

需要注意的是,xargs的解决方法不会打印任何echo标志,例如,如果文件中包含“-e / E”或“-n”,它会将其解释为xargs的默认echo参数。

另外,sed的示例在某些系统上可能无法正常工作,比如MacOS。可以尝试以下命令:`sed -e $'s/,/\\\n/g'`。

关于`--output-delimiter`中为什么需要美元符号的原因是,如果我们仅使用`--output-delimiter='\n'`,它会将一个字面字符串"\n"写入文件而不是换行符。在`$'\n'`中的美元符号用于告诉命令不要将字符串视为字面值。

0