Bash: 将一行拆分为多行
问题的出现原因是需要将一行文本拆分成多行。解决方法有以下几种:
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'`中的美元符号用于告诉命令不要将字符串视为字面值。