2014-02-28 33 views
2

分裂我有這樣一個字符串,命名爲選項字符串中的一個選項:找到空間在bash

"printer-is-accepting-jobs=true printer-is-shared=false printer-location=Library printer-make-and-model='HP LaserJet 600 M601 M602 M603' printer-state=3" 

他們是「選項=值」的格式,用空格隔開。但「打印機型號和模型」具有空間價值。

試圖命令:

for word in $Options; do echo $word; done 

所有的HP LaserJet M601 600 M602 M603是splited。

如何在bash命令中處理這個問題?

+0

也許這裏的答案將解決你的問題http://stackoverflow.com/questions/9084257/bash-array-with-spaces-in-elements – clancer

+1

確切地說,你想要什麼? – higuaro

+0

@ h3nr1x。我想將字符串拆分爲數組,每行的option = value。 – user3085367

回答

2

使用grep -oP

grep -oP "printer-make-and-model='\K[^']*" <<< "$s" 
HP LaserJet 600 M601 M602 M603 

或使用SED:

sed "s/^.*printer-make-and-model='\([^']*\).*/\1/" <<< "$s" 
HP LaserJet 600 M601 M602 M603 
+0

謝謝!對不起,忘了提及,我在Mac上。它沒有-P選項,-P用於什麼? – user3085367

+0

我也在OSX和'grep -P'可用(-P爲PCRE) – anubhava

+0

+1:借用你的'正則表達式'')' –

1

Anubhava's正則表達式是不錯的,所以如果你沒有grep -P選項,那麼你可以嘗試:

ack命令:

$ ack -ho "printer-make-and-model='\K[^']*" <<< "$options" 
HP LaserJet 600 M601 M602 M603 

Perl

$ perl -nle "print $+{f} if /printer-make-and-model='(?'f'\K[^']*)/" <<< "$options" 
HP LaserJet 600 M601 M602 M603 
+1

謝謝! ack不在Mac上。 perl很棒。 – user3085367

0

既然你需要解析的選項,你可以使用getopt。但是,這需要使用邪惡的eval命令。所以要小心你的輸入。

$ string="printer-is-accepting-jobs=true printer-is-shared=false printer-location=Library printer-make-and-model='HP LaserJet 600 M601 M602 M603' printer-state=3" 
$ eval a=("$string") 
$ eval b=($(getopt --long printer-make-and-model: -- ${a[@]/#/--} 2>/dev/null)) 
$ echo "${b[1]}" 
HP LaserJet 600 M601 M602 M603 
+0

在我的Mac上,**回聲「$ {b [1]}」**得到**「打印機制作和模型:」** – user3085367

+0

坦率地說,我沒有在Mac上試過,但我認爲, 'mac'上的'getopt'會給出與我的系統不同的輸出。嘗試在$ {b [@]}中輸入x;執行echo $ x; done'來查看getopt輸出中參數的順序是否已更改... – anishsane

1

您可以與多個AWK語句做到這一點:

while read record; do 
    while read key value; do 
     echo "K=($key) V=($value)" 
    done< <(awk -F"=" '{printf("%s %s\n", $1, $2)}' <<< $record) 
done< <(awk -F"printer-" '{for(i=2;i<NF;i++){printf("printer-%s\n", $i)}}' <<< $string) 

這將拆分成輸出鍵值對。

+0

@「Tim Verhoeven」,太棒了!您的'給我整個列表!謝謝! – user3085367