2013-03-29 89 views
2

目前,我有一個全功能的sed命令,增加了一個項目,以下列方式具體的文本文件列表...條件SED替代

ITEMS="$ITEM1 $ITEM2 $ITEM3" 

成爲下,當我們要插入$ITEM4 ...

ITEMS="$ITEM1 $ITEM2 $ITEM3 $ITEM4" 

列表中的項目數量是未知的;它是動態的。該文本中的美元符號和引號應從字面上理解。

我用下面的命令來完成除了列表(可變$itemNum在別處分配)...

sed "/^\s*ITEMS=/s/\"$/ \$ITEM$itemNum&/" file.txt 

這一切呢,當然是找到以ITEMS=線(也可能是與領先的空格),並將該行中的最後一個雙引號替換爲空格加上所需的項目加雙引號(將替換的雙引號放回原位)。但是,我有一個附加的情況下ITEMS列表可能是空的,像這樣......

ITEMS="" 

在這種情況下,我的命令將插入$ITEM4在列表像這樣結束......

ITEMS=" $ITEM4" 

不過,我想我的命令能夠佔到一個空列表,而不是把主要空間時,列表確實是空的,所以它只是看起來像......

ITEMS="$ITEM4" 

如何改變我現有的命令以最好地完成此操作?

在這種情況下

回答

2

拍攝被攝對象爲指導,在這裏是用sed做有條件的一種方法:

sed -e '/^\s*ITEMS=/{s/=""/="$ITEM'"$itemNum"'"/;t;s/"$/ $ITEM'"$itemNum&/;}" file.txt 

主要變化是我們嘗試先用空引號(「」)替換。如果成功,則條件分支t將我們發送到腳本的末尾,繞過另一個替換。如果第一次失敗,則僅發生第二次替換。我已經改變了引用來擺脫一些「傾斜的牙籤」,但它大約是您原始命令的66%。

編輯:由OP的請求「倚牙籤」的事情

原來放在雙引號整個sed腳本行,以便所有的「最$必須與反斜槓轉義重寫我的版本一樣,看起來像。這樣的:

sed -e "/^\s*ITEMS=/{s/=\"\"/=\"\$ITEM$itemNum\"/;t;s/\"$/ \$ITEM$itemNum&/;}" file.txt 

我只是覺得所有的反斜線分心,所以我把儘可能多的成單引號盡我所能,只留下$ itemNum在雙引號。在shell腳本中,如果兩個字符串相鄰,它們會粘在一起,因此var1=QRS; var2='ABC'$var1'XYZ'將var2設置爲'ABCQRSXYZ' - 如果您認爲變量可能包含空格,那麼最好引用它:var1=QRS; var2='ABC'"$var1"'XYZ'(no space間「‘和’」在那裏。

+0

謝謝。請問你請簡要解釋一下你的命令是如何構造的,關於單引號和雙引號的各種用法?就像你如何使用它們來說明問題的語法一樣?還有,你會介意添加一個使用所有傾斜牙籤,只是爲了我的學習嗎? – user2150250

+0

謝謝你的解釋,他們幫助很大。 – user2150250

1

,AWK更加靈活:

awk -F'"' -vn="$itemNum" '/^\s*ITEMS=/{sub(/"$/,($2?" ":"")"$ITEM"n"&")}1' file 

測試:

kent$  itemNum=4  
kent$ echo 'ITEMS=""'|awk -F'"' -vn="$itemNum" '/^\s*ITEMS=/{sub(/"$/,($2?" ":"")"$ITEM"n"&")}1' 
ITEMS="$ITEM4" 
kent$ echo 'ITEMS="$ITEM1 $ITEM2 $ITEM3"'|awk -F'"' -vn="$itemNum" '/^\s*ITEMS=/{sub(/"$/,($2?" ":"")"$ITEM"n"&")}1'              
ITEMS="$ITEM1 $ITEM2 $ITEM3 $ITEM4" 
+0

再次感謝肯特。這不工作用awk,但是你覺得有一種方法,使用SED做到這一點和'?'元字符吧? – user2150250