golang exec find命令正则表达式

时间:2017-09-13 02:08:48

标签: regex shell go find

我正在尝试在go:

中编写find命令(下面的shell命令)
find . -mindepth 3 -maxdepth 3 -regex '.*\(type-a\|type-b\)\/os.*'

以下是go片段:

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.*")

1 个答案:

答案 0 :(得分:2)

默认情况下,find将正则表达式解释为Emacs Regular Expressions,其中,特别是,更改运算符为\|,并使用反斜杠后跟括号\(执行分组, \)。因此,您应该使用正确的Emacs正则表达式语法,或者在-regextype选项的帮助下使用替代正则表达式语法,其中这些运算符不带反斜杠,例如:

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

由于Go中的反斜杠用作字符串中的转义字符,因此应使用额外的反斜杠转义反斜杠字符,例如:

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