在shell中执行git config -l | sed -n 's/^user.name=\(.*\)$/{\1}/p'
将产生git config中设置的当前“user.name”。但是如果我在ruby中用反引号`或者%x(<shel code>)
执行相同的命令,我什么都没有回来。
在这种情况下我没有使用sed
找到了另一种解决方法,但我想知道为什么我可以在没有sed
标志的情况下获得-n
的输出,这将是无论管道是什么,但我永远无法获得匹配的组(无论是单独的还是sed
没有-n
输出的流的一部分。)
答案 0 :(得分: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"