在bash中连接两个没有换行符的命令的输出

syn*_*tik 48 bash sed pipe concatenation

我需要的:

假设我有两个命令,A并且B每个命令返回一个单行字符串(即一个没有换行符的字符串,除了最后可能为1).我需要一个命令(或管道命令序列)C,它连接命令的输出AB在同一行上,并在它们之间插入1个空格字符.

它应该如何工作的示例:

例如,假设命令的输出A是引号之间的字符串:

"The quick"
Run Code Online (Sandbox Code Playgroud)

并且假设命令的输出B是引号之间的字符串:

"brown fox"
Run Code Online (Sandbox Code Playgroud)

然后我希望命令的输出是引号之间C字符串:

"The quick brown fox"
Run Code Online (Sandbox Code Playgroud)

我最好的尝试解决方案

在试图弄清楚C自己,似乎管道命令的后续序列应该工作:

{ echo "The quick" ; echo "brown fox" ; } | xargs -I{} echo {} | sed 's/\n//'
Run Code Online (Sandbox Code Playgroud)

不幸的是,这个命令的输出是

The quick
brown fox
Run Code Online (Sandbox Code Playgroud)

anu*_*ava 60

你可以使用tr:

{ echo "The quick"; echo "brown fox"; } | tr "\n" " "
Run Code Online (Sandbox Code Playgroud)

或使用sed:

{ echo "The quick"; echo "brown fox"; } | sed ':a;N;s/\n/ /;ba'
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

The quick brown fox 
Run Code Online (Sandbox Code Playgroud)

  • 好的,我还提供了一个有效的sed版本。 (2认同)

Mat*_*Mat 35

echo "$(A)" "$(B)"
Run Code Online (Sandbox Code Playgroud)

应该假设既不输出A也不B输出多行.

$ echo "$(echo "The quick")" "$(echo "brown fox")"
The quick brown fox
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是正确的,但需要正确引用。``echo "$(A)" "$(B)"`` 和 ``echo "$(echo "我喜欢这个星号")" "$(echo "*")"``。你可以尝试不加引号看看问题所在 (2认同)

hem*_*nto 9

我将尝试用另一个简单的例子来解释解决方案

我们必须连接以下命令的输出:
“pwd”和“ls”

echo "$(pwd)$(ls)";
Run Code Online (Sandbox Code Playgroud)

输出:2个连接的字符串


che*_*ner 5

$ commandA () { echo "The quick"; }
$ commandB () { echo "brown fox"; }
$ x="$(commandA) $(commandB)"
$ echo "$x"
The quick brown fox
Run Code Online (Sandbox Code Playgroud)