将字符串转换为shell参数

时间:2015-04-15 16:28:37

标签: javascript regex node.js bash shell

我很感兴趣如何将bash输入解析为参数。

例如,通过使用process.argv,我们在NodeJS中获得了一个字符串数组(但这与语言无关)。

我的问题是如何将像"node foo.js --foo "bar baz" -b foo"之类的输入解析为process.argv(或其他语言中的等价物)返回的数组(例如["node", "foo.js", "--foo", "\"bar baz\"", "-b", "foo"]

按空间拆分是不够的(因为引号)。是否有可能使用一些更复杂的正则表达式来处理引号并获得这样的数组?

2 个答案:

答案 0 :(得分:3)

使用shell-quote NPM包将处理此问题。

var parse = require('shell-quote').parse;
parse('node foo.js --foo "bar baz" -b foo');

[ 'node', 'foo.js', '--foo', 'bar baz', '-b', 'foo' ]

答案 1 :(得分:3)

由于似乎明确要求使用正则表达式解决方案,虽然这是适当解析器的任务,但这里有一个用于刺激的正则表达式。

考虑规格:

  • JS​​-兼容
  • 按空格标记,但将"..."'...'放在一起

可以使用简单的match函数来查找值,但不能很好地检测到嵌套转义引号的缺点(使用正则表达式进行递归匹配很困难。)

>>> str = "node foo.js --foo \"bar baz\" -b foo";
    str.match(/"[^"]+"|'[^']+'|\S+/g)
<<< ["node", "foo.js", "--foo", "\"bar baz\"", "-b", "foo"]

(简体)正则表达式解释:

  • "[^"]+"|'[^']+'是一个子模式,用于查找引号对,而不是引号之间的任何引号。
  • |替代其他选项。
  • \S是对\s的否定:它匹配非空格序列,它有效地断言我们匹配先前未收集的令牌。 +量化整个字符串。