2011-07-08 58 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' 
相关问题