Bash
在 shell 變數中擷取命令後的參數(括號之間)
假設我有一個文件,其中包含許多其他內容,
\命令{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
列印。