2012-12-20 149 views
1

之間的文本,我需要一些你SED嚮導給一個小白手....SED - 替換佔位符

我使用SED替代一些佔位符之間的文本。 問題是,他們是在不同的線路(和SED恨這顯然)。

我需要更換的文字是 '#SO' 和 '#EO',這樣之間:

#SO 
I need to replace this text 
#EO 

我想出了這一點:

sed -ni '1h; 1!H; ${ g; s/#SO\(.*\)#EO Test/1/REPLACEMENT/ p }' foo.txt 

我只是開始接觸SED,所以我可能完全錯誤,但任何建議都會很棒。

+0

當你寫出一些神祕而複雜的東西 - 難道你不知道sed是否真的是工作的正確工具? sed是一個簡單的替換在一條線上的優秀工具,但對於其他任何只使用awk的工具。基本上,如果你發現自己在sed中使用的不僅僅是「s」和「g」,那麼你幾乎肯定會使用錯誤的工具。 –

回答

4

使用sed,如下圖所示:

$ cat file 
line 1 
line 2 
#SO 
I need to replace this text 
#EO 
line 3 

$ sed -n '/#SO/{p;:a;N;/#EO/!ba;s/.*\n/REPLACEMENT\n/};p' file 
line 1 
line 2 
#SO 
REPLACEMENT 
#EO 
line 3 

工作原理:

/#SO/{      # when "#SO" is found 
    p       # print 
    :a       # create a label "a" 
    N      # store the next line 
    /#EO/!ba     # goto "a" and keep looping and storing lines until "#EO" is found 
    s/.*\n/REPLACEMENT\n/  # perform the replacement on the stored lines 
} 
p       # print 
+0

你美麗!感謝那。完美的作品。 –

0

這是你想要的東西:

$ cat file 
#SO 
I need to replace this text 
#EO 

$ awk '/#EO/{f=0} {print f ? "replacement text" : $0} /#SO/{f=1}' file 
#SO 
replacement text 
#EO 

如果不是,則顯示一些更具代表性的輸入。

1

這應該工作:

sed -n '/#SO/,/#EO/{s/.*/REPLACEMENT/;}' file 

更多詳細信息請參閱本link