我想用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
Run Code Online (Sandbox Code Playgroud)
pax*_*blo 17
您可以使用以下内容:
sed 's/foo/barfoo/g' baz
Run Code Online (Sandbox Code Playgroud)
(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
Run Code Online (Sandbox Code Playgroud)
括号捕获与模式匹配的实际文本以及\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
Run Code Online (Sandbox Code Playgroud)
就捕获组的工作方式而言,您可以使用括号来存储与模式匹配的文本,以便以后在替换中使用.捕获的标识符基于(从左到右读取的字符,因此正则表达式(我已经将\转义字符留下并为了清晰起见将其填充一点):
( ( \S* ) ( \S* ) )
^ ^ ^ ^ ^ ^
| | | | | |
| +--2--+ +--3--+ |
+---------1---------+
Run Code Online (Sandbox Code Playgroud)
当应用于文本时Pax Diablo会给你三组:
\1 = Pax Diablo
\2 = Pax
\3 = Diablo
Run Code Online (Sandbox Code Playgroud)
如下所示:
pax$ echo 'Pax Diablo' | sed 's/\(\(\S*\) \(\S*\)\)/[\1] [\2] [\3]/'
[Pax Diablo] [Pax] [Diablo]
Run Code Online (Sandbox Code Playgroud)