2013-03-28 44 views
1

我試圖用sed在被以特定方式格式化的文本文件,刪除列表中的特定項目中刪除的項目。我只是舉例說明;我有...使用的sed在列表

ITEMS="$ITEM $ITEM1 $ITEM2 $ITEM3" 

,我想從列表中刪除$ ITEM所以這將成爲...

ITEMS="$ITEM1 $ITEM2 $ITEM3" 

名單中還甚至可以只包含單獨$項目沒有編號$項目的,就像...

ITEMS="$ITEM" 

,這將成爲

ITEMS="" 

一旦$ ITEM被刪除掉當然。

在執行這一發現它不知道有多少$項目的存在列表/刪除。所述文本文件包含除此行之外的其他文本,但ITEMS =對於文本文件的行的開頭是唯一的,即,這是以ITEMS =開頭的唯一行。所以基本上,我想找到以ITEMS =開頭的行,並從中刪除$ ITEM元素。用sed怎麼能完成這個最好的?

+0

通過'$ ITEM'你從字面上的意思是一個美元符號後跟字'ITEM'?或者是一個Bash的變量?或者你有一個固定的字符串,而'$ ITEM'只是你的非正式記法它這個問題的目的是什麼? – ruakh

+0

'$ ITEM'是名副其實的美元符號後跟一個詞,它不是在這種情況下,可變的,正則表達式的字符,包括'$'和'「'需要被佔因此前面都有一個\ – user2150250

+0

,那麼你必須單引號,否則它不會工作:比較'ITEMS =「$ ITEM」;回聲「$條」''到ITEMS =「$項」;回聲「$ ITEMS「' –

回答

1

的空間之前和之後$ITEM真煩人。 :)

嘗試這一行:

sed -r 's/"\$ITEM /"/; s/\$ITEM //g; s/ ?\$ITEM"/"/' file 

測試一些示例:

kent$ echo 'ITEMS="$ITEM"'|sed -r 's/"\$ITEM /"/; s/\$ITEM //g; s/ ?\$ITEM"/"/'                     
ITEMS="" 
7pLaptop 20:57:44 /home/kent/myCodes/vim/last256 
kent$echo 'ITEMS="$ITEM $ITEM1 $ITEM2 $ITEM $ITEM3 $ITEM"'|sed -r 's/"\$ITEM /"/; s/\$ITEM //g; s/ ?\$ITEM"/"/' 
ITEMS="$ITEM1 $ITEM2 $ITEM3" 

編輯

爲OP的評論,加上解釋。

's/"\$ITEM /"/;  #step1 check if the first element is $ITEM, do sub 
s/\$ITEM //g;  #step2 handle the middle elements 
s/ ?\$ITEM"/"/'  #step3 handle the last element case. also this handles single ("$ITEM") case. 

我使用了3個步驟,因爲OP希望在處理後具有相同的格式(單個空格分隔值)。有可能是更簡單/更好的解決方案,我只是想到了這種方式,在3個步驟中進行替換/格式化。 :(

+0

@ user2150250是否爲你工作? – Kent

+0

是的,它爲我工作!非常感謝你。請參閱我上面的後續請求。我非常感謝。 – user2150250

+0

如果這是一個巨大的文件,你可能會用'sed -r'/ ITEMS = /!b; s/...'這樣的東西來獲得一個小的性能提升,這樣你就可以跳過無關緊要的替換嘗試。 (''/ ITEMS =/{s/...;}''也可以,但最後的分支b更簡單) – William

-1

取決於什麼是「字」對你來說,這可能會做你想要什麼:

echo 'a list of words' | sed 's/\<list\>//g' 
+0

這只是刪除了單詞「列表」,但留下了兩個空間,對吧? – Kent

+0

是的。根據你的語義是什麼,你必須改變你的需要。機會是\ sourword \> \ \ \