2012-06-22 170 views
3

我遇到以下問題。查找並替換爲sed

我有一個文件,裏面有很多單詞,我必須做的是在另一個文件中找到這些單詞,並用一個字母替換它們。

我不知道,我要刪除的話(太多了!),所以我不知道如何使用下面的sed命令

$ sed -i 's/words_old/word_new/g' /home/user/test.txt 

,但是我覺得我也必須使用cat命令:

$ cat filewithwordstobedeleted.txt 

但我不知道如何組合它們。

謝謝你幫助我! :)

法比奧

+0

哪裏的word_new從何而來?它們是否也在filewithwordstobedeleted.txt中指定,每個單詞旁邊,還是用同一個字母替換所有單詞? –

+0

我必須用單詞「null」替換所有單詞 – fabioln79

+1

請小心製作[clbuttic](http://thedailywtf.com/Articles/The-Clbuttic-Mistake-.aspx)錯誤。 –

回答

3

一個簡單的shell循環可以幫助你在這裏,假設你有一個每行字要被刪除:

cat filewithwordstobedeleted.txt | while read word; do 
    sed -i "s/$word/null/g" /home/user/test.txt 
done 

注意的是,使用cat不嚴格必要的,但使這個例子更易於閱讀。

+1

對於好奇,一個無貓的選擇是'而讀字;做...;完成 chepner

+0

這也是我的建議。但是,我想知道是否由於sed的多次調用會比較慢,比如果你可以以某種方式使用sed來運行它? –

+0

我已經嘗試過,但它以奇怪的方式工作也許是因爲我沒有每行一個字。所以不是用「null」替換每個單詞,而是在每行中放置「null」。它應該這樣工作:橙色菠蘿蘋果(同一行) - > null null null或orangepineappleapple - > nullnullnull – fabioln79

0

如果你的單詞列表是一個每行,而不是冗長得可笑:

sed -ri "s/$(tr "\n" "|" < filewithwordstobedeleted.txt | head -c-1)/null/g" /home/user/test.txt 
+0

不幸的是,不幸的是不是一個單詞列表,但在同一行上的一系列單詞,如:橙色菠蘿蘋果(同一行),我想作爲null null null或orangepineappleapple - > nullnullnull。是的,這很可笑,但時間不是問題。我可以讓它在沒有任何問題的服務器上運行。 – fabioln79

+0

@ fabioln79:我的意思是如果要刪除的單詞列表(filewithwordstobedeleted.txt)是每行一個。如果要修改的文件每行有多個字,我的命令就可以工作。這個長度不是關於運行時間,而是它是否超出了你所運行系統的命令行容量(我的系統上是2MB)。 –

0

這可能爲你工作(GNU SED):

# cat <<\! >/tmp/a 
> this 
> that 
> those 
> ! 
cat <<\! >/tmp/b 
> a 
> those 
> b 
> this 
> c 
> that 
> d 
> ! 
sed 's|.*|s/&/null/g|' /tmp/a 
s/this/null/g 
s/that/null/g 
s/those/null/g 
sed 's|.*|s/&/null/g|' /tmp/a | sed -f - /tmp/b 
a 
null 
b 
null 
c 
null 
d 
cat <<\! >/tmp/c 
> a 
> this and that and those 
> b 
> this and that 
> c 
> those 
> ! 
sed 's|.*|s/&/null/g|' /tmp/a | sed -f - /tmp/c 
a 
null and null and null 
b 
null and null 
c 
null