2011-11-17 88 views
8

我只是想做到以下替代多個線條圖案在sed

inputfile中更換

EXTRATHING { 
}; 

通過

SOMETHING {}; 

。爲此,我嘗試了

sed -e 's/EXTRATHING {\n};/SOMETHING/' input_file.txt >outfile.txt 

這不起作用。有人可以建議用sed做這件事的正確方法是什麼?

回答

5
sed -n '1h;1!H;${;g;s/EXTRATHING {\n};/SOMETHING {};/g;p;}' input_file.txt 

會這樣做。

問題在於它將整個輸入字符串存儲在sed的緩衝區中。

有關更多信息和更高效的版本,請參閱sed and Multi-Line Search and Replace

0

這可能會爲你工作:

sed '/^EXTRATHING {/,/^};/c\SOMETHING{}' input_file.txt >output_file.txt 

,或者如果你想編輯原始文件:

sed -i '/^EXTRATHING {/,/^};/c\SOMETHING{}' input_file 

編輯:這裏要求是一個例子:

cat <<! | sed '/^EXTRATHING {/,/^};/c\SOMETHING{}' 
> aaa 
> EXTRATHING { 
> }; 
> bbb 
> EXTRATHING { 
> }; 
> ccc 
> ! 
aaa 
SOMETHING{} 
bbb 
SOMETHING{} 
ccc 

編輯:如果第一個和最後一個地址是連續的行,請使用:

# cat <<\! | sed '/^EXTRATHING {/{N;s/^EXTRATHING {\n};/SOMETHING{}/}' 
> aaa 
> EXTRATHING { 
> bbb 
> }; 
> ccc 
> EXTRATHING { 
> }; 
> ddd 
> ! 
aaa 
EXTRATHING { 
bbb 
}; 
ccc 
SOMETHING{} 
ddd 

另一種方式(也許是更容易?):

echo -e "EXTRATHING {\n};" | sed '$!N;s/^EXTRATHING {\n};/SOMETHING {};/;P;D' 
SOMETHING {}; 
+0

小心發佈你的例子,這個工程;-)?我剛剛得到原始文檔返回..祝你好運。 – shellter

+0

謝謝@potong。但是,如果在「EXTRATHING {」和「};」之間還有一些其他行,則您的命令也會刪除原始模式。我不希望這些被替換。因此,下列內容不應被替換爲「EXTRATHING {\ n something \ n};」。 – bbv

+0

謝謝,我看到你的代碼和sed 4 *一起工作,但是沒有UWIN中的unversion版本。你使用範圍表達式來捕捉兩條線嗎?即'/ x /,/ y /'?祝你們好運。 – shellter

3

sed -e '/begin/,/end/{s/begin/replacement/p;d}'

+4

你能解釋一下嗎?謝謝。 :) – Ray

+1

我認爲這是基於對問題的一個不好的理解。 – BCS

3
sed -i.bak '/EXTRATHING/{N;s//SOMETHING/;s/\n//}' input_file.txt 
1
perl -lne 's/\s*};\s*$/SOMETHING{};/g if(/\s*};\s*$/);$f=0;if(/EXTRATHING {\s*$/){next;$f=1}else{print}' your_file 

如下測試:

> cat temp 
fjbwjfbw 
wefjkbwjk 
jbefwejr 
EXTRATHING { 
}; 
ghekg 
jhgjk 
wefjkwngk 
EXTRATHING { 
    }; 
jbgvjnrg 
jbfw 
wefnkwk 
EXTRATHING { 
}; 
> perl -lne 's/\s*};\s*$/SOMETHING{};/g if(/\s*};\s*$/);$f=0;if(/EXTRATHING {\s*$/){next;$f=1}else{print}' temp 
fjbwjfbw 
wefjkbwjk 
jbefwejr 
SOMETHING{}; 
ghekg 
jhgjk 
wefjkwngk 
SOMETHING{}; 
jbgvjnrg 
jbfw 
wefnkwk 
SOMETHING{}; 
> 
如果要更改文件內嵌

。添加一個-i標誌。 like:

perl -i -lne '.......' your_file 
0

它很難在sed中做到,需要寫下標。 但是,您可以用perl用一行代碼:

perl -0777 -pe 's/EXTRATHING {\n/SOMETHING {/g' input_file.txt > outfile.txt 

其中 -0777是記錄分隔符(在文本文件底線) -p所有文件並打印在屏幕上運行命令 -e說,它的一個在線命令