如何使用sed命令在模式字符串之前添加字符串?

时间:2011-07-08 04:16:52

标签: bash sed

我想用sed来修改名为“baz”的文件。

当我搜索模式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

3 个答案:

答案 0 :(得分:16)

您可以使用以下内容:

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

就捕获组的工作方式而言,您可以使用括号来存储与模式匹配的文本,以便以后在替换中使用。捕获的标识符基于从左到右读取的(个字符,因此正则表达式(我已经将\转义字符留下并为了清晰起见填充了一些字符):

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

当应用于文字Pax Diablo时会给你三组:

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

如下图所示:

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

答案 1 :(得分:3)

只需替换该行的开头即可。

sed '/^foo/s/^/bar/'

答案 2 :(得分:0)

要替换或修改除行尾或行尾之外的所有“foo”,我建议在行的开头和结尾使用唯一的标记值临时替换它们。

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'