2013-01-15 63 views
1

我是shell腳本的新手。我想逐行讀取文件,其中包含參數,如果參數中包含任何空格,我想用引號括起來替換它。使用Shell腳本查找帶空格的字符串並用引號括起

例如,如果文件(TEST.DAT)包含,

-DtestArgument1=/path/to a/text file 
-DtestArgument2=/path/to a/text file 

解析上述文件後,shell腳本應符合以下

-DtestArgument1="/path/to a/text file" -DtestArgument2="/path/to a/text file" 

這裏是我的shell腳本編寫串,

while read ARGUMENT; do 
    ARGUMENT=`echo ${ARGUMENT} | tr "\n" " "` 
     if [[ "${ARGUMENT}" =~ " " ]]; then 
      ARGUMENT=`echo $ARGUMENT | sed 's/\^(-D.*\)=(.*)/\1=\"\2\"/g'` 
      NEW_ARGUMENT="${NEW_ARGUMENT} ${ARGUMENT}" 
     else 
      echo "doesn't contains spaces" 
      NEW_ARGUMENT="${NEW_ARGUMENT} ${ARGUMENT}" 
     fi 
    done < test.dat 

但它拋出以下錯誤:

sed: -e expression #1, char 28: Unmatched) or \) 

該代碼應該與所有shell兼容。請幫助我。提前致謝。

回答

0

sed括號應該被轉義:你這樣做,在3個地方,你忘了......

ARGUMENT=`echo $ARGUMENT | sed "s/\^\(-D.*\)=\(.*\)/\1=\"\2\"/g"` 

一個地方BTW,我一般用"報價。

如果你喜歡'式的,這樣做:

ARGUMENT=`echo $ARGUMENT | sed 's/\^(-D.*)=(.*)/\1="\2"/g'` 
1

我認爲你應該簡化問題。不要擔心空格,只需在=之後引用參數即可。例如:

sed -e 's/=/="/' -e 's/$/"/' test.dat | paste -s -d\ - 

應該足夠了。如果你真的在乎空間,你可以嘗試這樣的:

sed -e '/=.* /{ s/=/="/; s/$/"/; }' test.dat | paste -s -d\ - 

這隻會注意到=後空間。只要使用/ /如果你真的想改變任何地方有空間的任何線。

不需要使用while/read循環:讓sed直接讀取文件。

+0

+1;以防萬一它也會讓其他人感到困惑:'-d''與'-d'''相同;即:使用單個空格作爲分隔符(分隔符); 'paste -s -d \ -'因此將所有(stdin)輸入行與一個空格連接起來,形成一個單獨的,空間分隔的輸出行。 – mklement0

+1

使用'-d \ -'的副作用是反斜槓後需要兩個空格;對許多人來說可能並不明顯。最好使用'-d''-'作爲@ mklement0的建議。 – devnull

相關問題