2014-01-21 56 views
0

在shell中執行git config -l | sed -n 's/^user.name=\(.*\)$/{\1}/p'會產生在git config中設置的當前「user.name」。但是如果我用反引號``或者用紅寶石%x(<shel code>)來做同樣的命令,我什麼也沒有返回。紅寶石和sed -n匹配組

我找到了另一種方式周圍沒有在這種情況下使用sed,但我不知道爲什麼我能得到的sed的輸出,而不-n標誌,這將是任何通過管道輸送到它,但我永遠無法得到匹配的組(無論是單獨還是sed沒有-n輸出的流的一部分)。

+1

你爲什麼不做'git config --get user.name'? –

回答

2

你可以完成大部分的在Ruby中:

conf = %x{git config -l} 
if m = conf.match(/^user.name=(.*)/) 
    username = m[1] 
end 

直接回答你的問題,在%x{}文字是受到相同的替換爲雙引號中的字符串,所以你需要躲避反斜線:

irb(main):023:0> u = %x{git config -l | sed -n 's/^user.name=\(.*\)$/{\1}/p'} 
=> "" 
irb(main):024:0> u = %x{git config -l | sed -n 's/^user.name=\\(.*\\)$/{\\1}/p'} 
=> "{Glenn Jackman}\n" 

或者你可以在一個單引號字符存儲命令:

irb(main):020:0> cmd = %q{git config -l | sed -n 's/^user.name=\(.*\)$/{\1}/p'} 
=> "git config -l | sed -n 's/^user.name=\\(.*\\)$/{\\1}/p'" 
irb(main):022:0> u = %x{#{cmd}} 
=> "{Glenn Jackman}\n" 
+0

非常好的解釋,這將在更復雜的情況下派上用場,對我來說毫無疑問 – polpetti