Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash GNU sed:使用s命令在图案空间后打印新行_Bash_Sed - Fatal编程技术网

Bash GNU sed:使用s命令在图案空间后打印新行

Bash GNU sed:使用s命令在图案空间后打印新行,bash,sed,Bash,Sed,BSD sed:始终在输出上追加换行符,即使输入行未以换行符结尾 GNU sed:保留尾随换行符的状态,即,仅当输入行以一个换行符结尾时,才会追加一个换行符 有没有办法在GNU sed中模拟BSD sed的行为? 例如: nvidia smi的输出: +-----------------------------------------------------------------------------+ | NVIDIA-SMI 450.66 Driver Version: 45

BSD sed:始终在输出上追加换行符,即使输入行未以换行符结尾

GNU sed:保留尾随换行符的状态,即,仅当输入行以一个换行符结尾时,才会追加一个换行符

有没有办法在GNU sed中模拟BSD sed的行为?

例如:

nvidia smi的输出:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.66       Driver Version: 450.66       CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce GTX 108...  Off  | 00000000:26:00.0 Off |                  N/A |
|  0%   49C    P8     9W / 250W |     18MiB / 11177MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 1050    Off  | 00000000:27:00.0 Off |                  N/A |
| 57%   44C    P8    N/A /  75W |      7MiB /  2000MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
我的sed命令:

 loads=$(eval nvidia-smi | sed -nr 's/.*\s([0-9]+)MiB\s*\/\s*([0-9]+)MiB.*/\1 \2/p')
BSD sed中的输出:

# echo $loads
# 18 11177
# 7 2000
以GNU为单位的输出:

# echo $loads
# 18 11177 7 2000

我已经尝试了我遇到的一切,包括交换保持和模式空间,但就是无法使用GNU在第一个模式后打印新行。

我怀疑您在BSD(macOS?)上使用了zsh。这就是bash和zsh之间的区别

[zsh] $ v=$( printf '%s\n' hello world )
[zsh] $ echo $v
hello
world
[zsh] $

[bash] $ v=$( printf '%s\n' hello world )
[bash] $ echo $v
hello world
[bash] $ echo "$v"
hello
world
[bash] $

您可以发布有关shell/OS的详细信息吗?我无法用GNU sed v 4.7
eval nvidia smi再现您的问题
?只需
nvidia smi
。。。这就像做
eval eval eval eval echo
。只需运行命令。可能您只需要
nvidia smi--query gpu=memory.used,memory.total--format=csv,nounits,noheader
?或者,
loads=$(nvidia smi--query gpu=memory.used,memory.total--format=csv,nounits,noheader)
,然后
echo“${loads/,/}”,如果您需要在两个值之间留一个空格
,也可以尝试
echo“$loads”
,在expansion@gforce89:那不是回声,是贝壳。