2017-09-13 144 views
1

我试图写在旅途中find命令(外壳下面的命令):golang EXEC find命令的正则表达式

find . -mindepth 3 -maxdepth 3 -regex '.*\(type-a\|type-b\)\/os.*' 

这里是旅途片段:

package main 

import (
    "bytes" 
    "fmt" 
    "os/exec" 
) 

func main() { 

    cmd := exec.Command("/usr/bin/find", "/opt/system/versions", 
         "-mindepth", "3", "-maxdepth", "3", 
         "-regex", ".*(type-a|type-b)/os.*") 

    var out bytes.Buffer 
    var stderr bytes.Buffer 
    cmd.Stdout = &out 
    cmd.Stderr = &stderr 

    err:= cmd.Run() 
    if err != nil { 
     fmt.Println(fmt.Sprint(err) + ": " + stderr.String()) 
     return 
    } 
    fmt.Println("Directory contents : ", out.String()) 
} 

,如果我寻找工作正常仅为type-a(或者只是type-b)。当我搜索type-atype-b(shell命令可以正常工作)时不起作用。在输入Command的正则表达式中,我得到了什么错误?

当我逃离(|)使用\,去抱怨转义序列 - unknown escape sequence: (

cmd := exec.Command("/usr/bin/find", "/opt/system/versions", 
         "-mindepth", "3", "-maxdepth", "3", 
         "-regex", ".*\(type-a\|type-b\)/os.*") 
+0

你应该逃避'(','|'和')'在转到脚本以及 –

+0

我相信'''被解释为'find'命令的shell'pipe'。 – kaza

+0

@bulbus它不被解释为shell管道,当使用'exec.Command'时,shell根本不处理参数。 – Adrian

回答

2

默认情况下,find解释的正则表达式为Emacs Regular Expressions,其中,特别是,变更运营商\|,并且使用反斜杠后跟括号\(,\)进行分组。因此,您应该用正确的Emacs的正则​​表达式的语法,或使用替代正则表达式的语法与-regextype选项的帮助下,在这些运营商不与反斜杠前缀,如:

find -regextype 'posix-extended' -regex '.*(type-a|type-b)/os.*' 

由于围棋反斜杠作为在字符串中的转义字符,你应该逃避反斜杠字符本身带有一个额外的反斜杠,如:

cmd := exec.Command("/usr/bin/find", "/opt/system/versions", 
        "-mindepth", "3", "-maxdepth", "3", 
        "-regex", ".*\\(type-a\\|type-b\\)\\/os.*")