如何从进程输出中删除换行符?

14

我称呼git获取顶层目录(根据有没有一种方法可以一次性获取git根目录?)。

(let ((tmpbuffer (get-buffer-create (make-temp-name "git"))))
  (call-process "git" nil tmpbuffer nil "rev-parse" "--show-toplevel")
  (with-current-buffer tmpbuffer
    (with-output-to-string
      (princ (buffer-string))
      (kill-buffer))))

但是返回的字符串末尾有一个换行符。我不确定如何去掉它。

4个回答

17

我认为你能行。

(replace-regexp-in-string "\n$" "" 
              (shell-command-to-string "git rev-parse --show-toplevel"))

2
这不仅仅是删除输出末尾的换行符。我添加了一个替代答案。 - Clément
你能解释一下为什么不行吗? - malana

10
如果您只想删除输出末尾的换行符,请使用

。这与删除所有换行符不同,它仅删除最后一个换行符。
(replace-regexp-in-string "\n\\'" "" 
  (shell-command-to-string "git rev-parse --show-toplevel"))

被接受的答案还将输出中的连续换行符("\n\n")替换为单个换行符("\n"),因为$匹配字符串结尾或换行符后的位置,而\\'仅匹配字符串结尾。

5

假设它存储在变量 output-string 中,最后的换行符可以这样删除:

(substring output-string 0 -1)

使用 shell-command 的方式,代码如下:

(substring
  (shell-command-to-string "git rev-parse --show-toplevel")
  0 -1)

2

如果您对于优秀的外部软件包感到满意。

请使用s-trim

ELISP> (shell-command-to-string "light -G")
"60.00\n"

ELISP> (s-trim (shell-command-to-string "light -G"))
"60.00"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接