【发布时间】:2017-09-13 02:08:47
【问题描述】:
我正在尝试在 go 中编写 find 命令(下面的 shell 命令):
find . -mindepth 3 -maxdepth 3 -regex '.*\(type-a\|type-b\)\/os.*'
这里是 go sn-p:
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 的正则表达式模式中做错了什么?
当我使用 \ 转义 (、| 和 ) 时,go 抱怨转义序列 - unknown escape sequence: (:
cmd := exec.Command("/usr/bin/find", "/opt/system/versions",
"-mindepth", "3", "-maxdepth", "3",
"-regex", ".*\(type-a\|type-b\)/os.*")
【问题讨论】:
-
你也应该在 Go 脚本中转义
(、|和) -
我相信
|被解释为pipe的shellfind命令。 -
@bulbus 不解释为shell管道,使用
exec.Command时shell根本不处理参数。