2017-09-13 138 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.*")