GNU sed: печать новой строки после пробела шаблона с помощью команды s

#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] $