【问题标题】:GNU sed : print new line after pattern space using the s commandGNU sed:使用 s 命令在模式空间后打印新行
【发布时间】: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:那不是回声,是外壳。

标签: bash sed


【解决方案1】:

我怀疑您在 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] $

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    相关资源
    最近更新 更多