Bash

在 shell 變數中擷取命令後的參數(括號之間)

  • January 31, 2015

假設我有一個文件,其中包含許多其他內容,

\命令{arg1,arg2,arg3}

(參數是路徑,用/, ., 字元和數字表示)

但是使用者也可以用它來呼叫它

\command{arg1,
arg2 ,
arg3
}

也就是說,在多行和多餘的空間。

我想找到一個包含在 shell 腳本中的正常模式,以便 n 個變數包含 n 個參數。如何進行 ?


我設法寫了

echo "\command{arg1,
   arg2 ,
   arg3
   }" | sed -n -e 's/\\command//p' | sed 's/,/\n/' | sed 's/{\|}//'

但這只是輸出arg1,我什至不確定如何將它儲存在變數中。

有關的:

但我無法結合所有這些成分來獲得我想要的東西。

我想找到一個包含在 shell 腳本中的正常模式,以便 n 個變數包含 n 個參數

下面創建一個arglist包含每個參數的 shell 數組:

$ readarray -t arglist < <(echo "\command{arg1,
   arg2 ,
   arg3
   }" | sed -n '/\\command/{ :a;/}/!{N;b a}; s/\\command{//; s/[ \n}]//g; s/,/\n/g; p}')

通過使用該declare語句,我們可以看到它有效:

$ declare -p arglist
declare -a arglist='([0]="arg1" [1]="arg2" [2]="arg3")'

這是另一個範例,其中的參數位於一行:

$ readarray -t arglist < <(echo "\command{arg1, arg2, arg3, arg4}"  | sed -n '/\\command/{ :a;/}/!{N;b a}; s/\\command{//; s/[ \n}]//g; s/,/\n/g; p}')

同樣,它有效:

$ declare -p arglist
declare -a arglist='([0]="arg1" [1]="arg2" [2]="arg3" [3]="arg4")'

請注意,其中的空間< <(是必不可少的。我們正在重定向來自程序替換的輸入。沒有空間,bash將完全嘗試其他東西。

這個怎麼運作

sed命令有點微妙。讓我們一次看一遍:

  • -n

除非明確要求,否則不要列印行。

  • /\\command/{...}

如果我們找到包含 的行\command,則執行大括號中的命令,如下所示:

  • :a;/}/!{N;b a}

這會將行讀入模式緩衝區,直到我們找到包含}. 這樣,我們就可以立即獲得整個命令。

  • s/\\command{//

刪除\command{字元串。

  • s/[ \n}]//g

刪除所有空格、右大括號和換行符。

  • s/,/\n/g

用換行符替換逗號。完成後,每個參數都在單獨的行上,這就是readarray想要的。

  • p

列印。

引用自:https://unix.stackexchange.com/questions/182123