【发布时间】:2021-01-14 20:09:02
【问题描述】:
BSD sed:总是在输出中附加一个换行符,即使输入行不是以一个结尾。
GNU sed:保留尾随换行状态,即,仅当输入行以 1 结尾时,它才会附加换行符。
有没有办法在 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 sed 中的输出:
# echo $loads
# 18 11177 7 2000
我已经尝试了所有我遇到的方法,包括交换保持和模式空间,但无法让 GNU sed 在第一个模式之后打印新行。
【问题讨论】:
-
您能发布有关您的外壳/操作系统的详细信息吗?我无法用 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//,/ }" if you need a space between the two values? -
另外,试试
echo "$loads",在展开时从未引用的变量中删除换行符 -
@gforce89:那不是回声,是外壳。