ruby和sed -n匹配组

时间:2014-01-21 18:49:03

标签: ruby sed

在shell中执行git config -l | sed -n 's/^user.name=\(.*\)$/{\1}/p'将产生git config中设置的当前“user.name”。但是如果我在ruby中用反引号`或者%x(<shel code>)执行相同的命令,我什么都没有回来。

在这种情况下我没有使用sed找到了另一种解决方法,但我想知道为什么我可以在没有sed标志的情况下获得-n的输出,这将是无论管道是什么,但我永远无法获得匹配的组(无论是单独的还是sed没有-n输出的流的一部分。)

1 个答案:

答案 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"
相关问题