2011-07-08 80 views
7

我想使用sed來修改名爲「baz」的文件。如何使用sed命令在模式字符串之前添加字符串?

當我搜索一個圖案foo,foo不在行首或行尾時,我想在foo之前添加bar,我怎樣才能使用sed?

Input file named baz: 
blah_foo_blahblahblah 
blah_foo_blahblahblah 
blah_foo_blahblahblah 
blah_foo_blahblahblah 

Output file 
blah_barfoo_blahblahblah 
blah_barfoo_blahblahblah 
blah_barfoo_blahblahblah 
blah_barfoo_blahblahblah 

回答

14

你可以使用類似:

sed 's/foo/barfoo/g' baz 

(該g末意味着全球性的,在每行每一次出現,而不是僅僅是第一)。

對於任意(而不是固定的)模式,如foo[0-9],你可以使用捕捉組如下:

pax$ echo 'xyz fooA abc 
xyz foo5 abc 
xyz fooB abc' | sed 's/\(foo[0-9]\)/bar\1/g' 

xyz fooA abc 
xyz barfoo5 abc 
xyz fooB abc 

括號捕捉匹配模式的實際文本和\1使用它在替代。

你可以使用這個任意複雜的模式,包括確保你只匹配完整的單詞。例如,只有變着花樣如果它立即由字邊界包圍:

pax$ echo 'xyz fooA abc 
xyz foo5 abc foo77 qqq xfoo4 zzz 
xyz fooB abc' | sed 's/\(\bfoo[0-9]\b\)/bar\1/g' 

xyz fooA abc 
xyz barfoo5 abc foo77 qqq xfoo4 zzz 
xyz fooB abc 

在捕獲組是如何工作的,你可以使用括號來存儲供以後使用相匹配的模式文本條款在更換。捕獲的標識是基於(人物從左至右,所以正則表達式(我已經離開了\轉義字符和填充有點爲清楚起見):當應用到文本Pax Diablo

((\S*) (\S*)) 
^^ ^^ ^^ 
| |  | |  | | 
| +--2--+ +--3--+ | 
+---------1---------+ 

如下圖所示

\1 = Pax Diablo 
\2 = Pax 
\3 = Diablo 

:會給你三個組

pax$ echo 'Pax Diablo' | sed 's/\(\(\S*\) \(\S*\)\)/[\1] [\2] [\3]/' 
[Pax Diablo] [Pax] [Diablo] 
+0

實際上我想追加匹配模式之前的字符串,有沒有辦法做到這一點? –

+1

甚至是'sed's/^ foo/bar&/''。 –

+0

好吧,foo沒有出現在行 –

3

只是替代不同的東西行的開始。

sed '/^foo/s/^/bar/' 
+0

的「S」是匹配模式之前添加字符串? –

+0

不是。要替換**替換模式。該模式恰好是該行的開始。 –

+0

foo怎麼樣不是行的開始? –

0

更換或修改所有的 「富」 EXCE在開始或結束時,我建議在開始和結束時用一個唯一的哨兵值暫時替換它們。

sed 's/^foo/____veryunlikelytoken_bol____/ 
    s/foo$/____veryunlikelytoken_eol____/ 
    s/foo/bar&/g 
    s/^____veryunlikelytoken_bol____/foo/ 
    s/____veryunlikelytoken_eol____$/foo/' 

sed沒有辦法指定「不能在這裏匹配」。在Perl的正則表達式和衍生物(意爲從Perl的正則表達式借用了Perl的衍生語言,不一定是語言),你有各種負面說法,所以你可以這樣做

perl -pe 's/(?!^)foo(?!$)/barfoo/g' 
相關問題