如何用分隔符将两行包装成单行

Spi*_*ike 7 shell text-processing

我已经执行了以下命令

cat /proc/loadavg && date
Run Code Online (Sandbox Code Playgroud)

实际结果:

0.00 0.00 0.00 1/803 26256
Fri Aug 26 09:00:56 EEST 2016
Run Code Online (Sandbox Code Playgroud)

预期结果:

0.00 0.00 0.00 1/803 26256 @@ Fri Aug 26 09:00:56 EEST 2016
Run Code Online (Sandbox Code Playgroud)

我试过sedtr,但没有奏效。

cat /proc/loadavg && date | sed 's/\n/ @@ /g'

cat /proc/loadavg && date | tr '\n' ' @@ '
Run Code Online (Sandbox Code Playgroud)

任何想法,我缺少什么?

Kus*_*nda 15

最好的办法是使用printf. 你有两个字符串,你想用一些额外的格式输出它们。这正是printf它的作用。

$ printf "%s @@ %s\n" "$(cat /proc/loadavg)" "$(date)"
Run Code Online (Sandbox Code Playgroud)

您的tr尝试不起作用,因为tr修改的是characters,而不是 words 。不过,您可以使用它用一个字符替换换行符:

$ ( cat /proc/loadavg; date ) | tr '\n' '@'
Run Code Online (Sandbox Code Playgroud)

...但它并没有完全满足您的需求。

您的sed尝试不起作用,因为换行符从输入中剥离sed(即sed -n '/\n/p' inputfile永远不会打印任何内容)。

sed如果您在编辑第一行(这在它们之间放置一个换行符date)时使用N编辑命令读取第二行(来自),您仍然可以这样做:

$ ( cat /proc/loadavg; date ) | sed 'N;s/\n/ @@ /'
Run Code Online (Sandbox Code Playgroud)

...但我个人更喜欢这个printf解决方案。


ran*_*ing 8

你可以这样做:

echo `cat /proc/loadavg` @@ `date`
Run Code Online (Sandbox Code Playgroud)


Sat*_*ura 7

像这样:

( cat /proc/loadavg && date ) | sed 'N; s/\n/ @@ /'
Run Code Online (Sandbox Code Playgroud)

首先,您的尝试不起作用,因为管道|仅适用于date,而不是 no both 命令。要解决此问题,您需要cat ... && date在子shell 中运行,然后重定向子shell 的stdout.

然后tr '\n' ' @@ '不起作用,因为您不能用多个字符替换一个字符。

并且sed 's/\n/ @@ /g'不起作用,因为一次sed只能看到一行。要让它看到换行符,您需要将两行输入合并到同一个缓冲区中。这就是N上面所做的。

  • 这对我有用。进一步扩展`sed`的`N`命令。`n` 打印要输出的模式空间并将下一行拉入模式空间 - 就像 sed 无论如何都会做的那样。`N` 命令将下一行拉入模式空间但 * 不* 打印模式,所以你最终在模式空间中得到两行,这就是替换 `s/\n/ @@ /` 的原因作品 (4认同)