【问题标题】:golang exec find command regex [duplicate]golang exec查找命令正则表达式[重复]
【发布时间】: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-atype-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 的shell find 命令。
  • @bulbus 不解释为shell管道,使用exec.Command时shell根本不处理参数。

标签: regex shell go find


【解决方案1】:

默认情况下,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.*")

【讨论】:

  • 当 '|' 时,这不适用于 pgrep Linux 命令在模式表达式中使用。看起来像 Golang 中的错误。
猜你喜欢
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 2020-05-03
相关资源
最近更新 更多