如何将命令的多行输出合并为一行?

如何将命令的多行输出合并为一行?

我在 bash shell 中的命令有以下输出:

username
country

但我想将打印输出修改为:

username - country

谢谢。

答案1

我会做类似的事情:

$ seq 6 | awk '{printf "%s", sep $0; sep = " - "}; END {if (NR) print ""}'
1 - 2 - 3 - 4 - 5 - 6

或者:

$ seq 6 | paste -d ' - \n' - /dev/null /dev/null -
1 - 2
3 - 4
5 - 6

或者:

$ seq 5 | sed '$!N;s/\n/ - /'
1 - 2
3 - 4
5

如果只是两行输出,你也可以这样做:

$ seq 2 | { IFS= read -r a; IFS= read -r b; printf '%s\n' "$a - $b"; }
1 - 2

在 shell 中,像bashwhereread和一样printf是内置的,这样就不必执行单独的命令。在 中bash,您可以通过设置选项来保存生成额外的进程来执行该处理lastpipe(仅在非交互式 shell 实例中)。

答案2

tr可以将一个字符转换为另一个字符:

echo "username
country
town" | tr '\n' ' '

输出:

username country town

用于tr -d将字符(换行符)替换为空:

echo "username
country
town" | tr -d '\n'

输出:

usernamecountrytown

但如果你想用几个字符替换换行符,tr这是不够的(尽管如此,我还是谈到了它,因为它是一个非常简单的命令)。

但可以通过以下方式完成sed

echo "username
country
town" | sed ":a; N; s/\n/ - /; ta;"

输出:

username - country - town

答案3

 awk 'ORS=" - "{print $0}' filename|awk '{gsub(/- $/,"",$0);print }'

输出

username - country

答案4

通过管道将其连接到此:

sed -z 's|\n| - |'

它使用 GNUsed将换行符替换为-.

相关内容