2017-04-21 51 views
2

我有一個字符串變量:如何獲得os.Args般的記號在命令行字符串

commandLineString := `echo -n "a b c d"` 

我想將它隱蔽於:

args := []string{"echo", "-n", "\"a b c d\""}

我該怎麼辦它?

+0

https://www.google.co.id/#q=golang+split+string+by+space+keep+quoted+string – har07

+1

具體而言,[此主題](https://groups.google.com /論壇/#!主題/ golang-nuts/pNwqLyfl2co),它使用庫[go-shellwords](https://github.com/mattn/go-shellwords)提出了幾種方法之一。 – har07

+0

@ har07它適用於我所需要的,謝謝你許多! –

回答

-3

如果字符串修復了3個參數,您可以通過strings.SplitN來完成。這裏是關於golang字符串庫的完整文檔。 https://golang.org/pkg/strings/#SplitN

CMIIW ^^

+0

這是如何保持引用字符串? – md2perpe

+0

@ md2perpe使用'SplitN()'將空間分割,指定最大分割爲3,這樣第二個空格之後的子字符串就不會被分割了。只能使用修正的參數數量,只有最後一個參數可以包含空格。無論如何,這項工作與OP的具體示例.. – har07

0

這可以在一個非常緊湊的方式使用regular expression表示。

輸入(命令)是一系列的標記:

  1. 要麼不引用,並且不能包含引號和空格,
  2. 或引用和產卵,直到下一個引號和可以包含空格(但不是引號)。

和:

  • 令牌由空格分隔,或輸入的結束。
  • 從上市標準的正則表達式:

      ("[^"]*"|[^"\s]+)(\s+|$) 
    
    Criteria: __2____ __1___ __3__ 
    

    使用Go的regexp包的解決方案是很短:

    s := `echo -n "a b c d"` 
    
    pattern := `("[^"]*"|[^"\s]+)(\s+|$)` 
    
    r := regexp.MustCompile(pattern) 
    
    fmt.Printf("%q\n", r.FindAllStringSubmatch(s, -1)) 
    fmt.Printf("%q\n", r.FindAllString(s, -1)) 
    

    輸出(嘗試在Go Playground):

    [["echo " "echo" " "] ["-n " "-n" " "] ["\"a b c d\"" "\"a b c d\"" ""]] 
    ["echo " "-n " "\"a b c d\""] 
    

    備註是的regexp.FindAllString()結果還包含標記之間的定界符(空格),所以你可以調用strings.TrimSpace()他們刪除這些:

    ss := r.FindAllString(s, -1) 
    out1 := make([]string, len(ss)) 
    for i, v := range ss { 
        out1[i] = strings.TrimSpace(v) 
    } 
    fmt.Printf("%q\n", out1) 
    

    這給所需的輸出:

    ["echo" "-n" "\"a b c d\""] 
    

    或者,你可以使用的regexp.FindAllStringSubmatch()結果:它返回切片的切片,使用第二元件(位於索引1)從每個元素:

    sss := r.FindAllStringSubmatch(s, -1) 
    out2 := make([]string, len(sss)) 
    for i, v := range sss { 
        out2[i] = v[1] 
    } 
    fmt.Printf("%q\n", out2) 
    

    這也給了所需的輸出:

    ["echo" "-n" "\"a b c d\""] 
    

    嘗試這些在Go Playground)。

    +0

    這種方法有幾個問題:首先,它包括帶引號參數的引號,這是os.Args沒有的,並且需要代碼使用它來處理它們;其次,它沒有解釋參數中的逃脫引號。 – Adrian

    +0

    @Adrian它不包含帶引號參數的引號,這只是我用'%q'動詞打印它以確保它們在那裏。用'%v'打印它,你會看到它們是普通的引號。 – icza