我正在尝试在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-a
或type-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 :(得分: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.*")