Bash GNU sed:使用s命令在图案空间后打印新行
BSD sed:始终在输出上追加换行符,即使输入行未以换行符结尾 GNU sed:保留尾随换行符的状态,即,仅当输入行以一个换行符结尾时,才会追加一个换行符 有没有办法在GNU sed中模拟BSD sed的行为? 例如: nvidia smi的输出: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
+-----------------------------------------------------------------------------+
| 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:那不是回声,是贝壳。