2013-11-27 156 views
0

我有一個文件多行像這些如何在使用SED時保留部分字符串?

APPLE JUICE 
APPLE JAM 
APPLE JELLY 

我想更換「蘋果」與「橙子」和「商店」追加到字符串的結尾。輸出將是

ORANGE JUICE SHOP 
ORANGE JAM SHOP 
ORANGE JELLY SHOP 

如何在sed或vim中做到這一點?

EDIT1: 我發現,在sed

#replace APPLE with ORANGE 
sed -i s/APPLE/ORANGE/g foo.txt 
#in a line containing ORANGE replace newline with SHOP 
sed -i '/ORANGE/s/$/ SHOP/g' 

問題現在的工作是,我不能讓第二個命令在Vim中工作的解決方案。所以這是一個vim的問題。

+0

你有什麼試過?這是非常基本的......你需要's'命令來替換文本。 – twalberg

回答

0

在這裏你去:

kent$ echo "APPLE JUICE 
APPLE JAM 
APPLE JELLY"|sed 's/\bAPPLE\b/ORANGE/;s/$/ SHOP/' 
ORANGE JUICE SHOP 
ORANGE JAM SHOP 
ORANGE JELLY SHOP 

我加字的邊界,使像PINEAPPLE不會被vim的PINEORANGE

取代,同樣的想法:

%s/\<APPLE\>/ORANGE/|%s/$/ SHOP/ 

編輯

當我發佈答案時,沒有要求,只有在有ORANGE匹配時才追加SHOP。 OP在我的回答後更新了問題。

反正,我添加了另一個VIM CMD:

%s/\<APPLE\>/ORANGE/g|%s/.*\<ORANGE\>.*/& SHOP/ 
+1

真棒,你回答,但我們應該鼓勵用戶嘗試自己的東西,然後帶着問題來到這裏,而不是讓他們不試圖。 (我確定這是一個深入討論的話題/ meta,只是我的2¢) – Siddhartha

+0

謝謝! vim解決方案就是我需要的。再次感謝! – user2708149

+0

@Siddhartha他想要做什麼,添加另一個評論「你有什麼嘗試?」。 –

2

沒有,@不含肯特的Elid回答APPLE行和文件追加店所有行。您需要使用稀土的子表達式:

echo "APPLE JUICE\ 
CHERRY JAM\ 
APPLE JELLY" | sed 's/^APPLE \(.*\)$/ORANGE \1 SHOP/' 
ORANGE JUICE SHOP 
CHERRY JAM 
ORANGE JELLY SHOP 
+0

當我回答這個問題時,沒有要求僅在有「APPLE」的情況下追加SHOP。新的要求是,爲ORANGE添加SHOP。 :) – Kent

2

在VIM本身試試這個命令模式

:(。* \)%S/APPLE \/ORANGE \ 1個SHOP/g的

+0

如果原始行有'ORANGE',但沒有'APPLE',則此命令不會將'SHOP'添加到該行。 '在包含ORANGE的行中#用SHOP替換換行符 – Kent

0

@dyomas是對的,@肯特的答案不加區分地追加SHOP全部行。

這是一個解決方案,不使用子表達式;相反,它使用測試替換的t命令,然後僅附加SHOP

sed 's/\bAPPLE\b/ORANGE/; t append; b; :append s/$/ SHOP/' 

由於t命令在取代的情況下跳轉(但我們需要的對面),我們必須跳「過」一個b命令,否則中止行處理。

相關問題