#bash #sed
#bash #sed
Вопрос:
BSD sed: всегда добавляет новую строку при выводе, даже если строка ввода не заканчивается на единицу.
GNU sed: сохраняет статус завершающей новой строки, т. Е. Добавляет новую строку только в том случае, если входная строка заканчивалась единицей.
Есть ли способ эмулировать поведение BSD sed в GNU 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] )MiBs*/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 печатать новую строку после первого шаблона.
Комментарии:
1. Не могли бы вы опубликовать подробную информацию о вашей оболочке / ОС? Я не могу воспроизвести вашу проблему с GNU sed v 4.7
2.
eval nvidia-smi
? Простоnvidia-smi
… Это похоже на выполнениеeval eval eval eval echo
. Просто запустите команду.3. Может быть, все, что вам нужно
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
?4. Кроме того, попробуйте
echo "$loads"
, новые строки удаляются из переменных без кавычек при расширении5. @gforce89: Это не эхо, это оболочка.
Ответ №1:
Я подозреваю, что вы используете zsh на BSD (macOS?). В этом разница между bash и zsh.
[zsh] $ v=$( printf '%sn' hello world )
[zsh] $ echo $v
hello
world
[zsh] $
[bash] $ v=$( printf '%sn' hello world )
[bash] $ echo $v
hello world
[bash] $ echo "$v"
hello
world
[bash] $