您可以将多个 sed 表达式与;
字符链接在一起。这里分别看一下每一个。
第一个表达式 ,在分隔符's/^void.*{$/!b
之间有一个匹配器表达式。/
它匹配:
^
- 行的开头
void
- 后跟字符“void”
.*
- 紧随其后
{
- 后跟左卷曲
$
- 紧随其后的是行尾
第一个表达式中的修饰符 ,!b
表示如果匹配器不匹配,则中止 sed 评估。
:a
表达式是一个标签。它与称为分支的类似 goto 的 sed 功能一起使用。我们将在下一个表达式中看到标签是如何使用的。
表达式/\n}$/bb
匹配:
\n
- 换行符
}
- 紧随其后的是右卷曲
$
- 紧随其后的是行尾
修饰符bb
意味着如果找到匹配项,则“分支”到标签 b。标签 b 在后面的表达式中定义为:b
。
$!{N;ba}
表达式应该读为一个,即使它的中间有一个;
。在这种情况下,卷曲代表一系列要一起执行的命令。
$!
- 如果不是输入结束
{
- 启动命令组(在这种情况下,有两个)
N
- 默读另一行
ba
- 分支以标记 a
}
- 结束命令组
接下来是 label ,当我们通过表达式:b
单独匹配一行上的单个时,我们将点击它。}
/\n}$/bb
最后有两种替代模式,它们是非常标准的正则表达式。表达式之前的s
本质意思是s/find_this/replace_it_with_this/
。在 的情况下s/\n/&test1&/
,我们有:
\n
- 找到换行符
/
- 并将其替换为
&
- 在第一个表达式中匹配的内容(在本例中为换行符)
test1
- 单词 test1
&
- 再次匹配的东西
所以基本上意味着用s/\n/&test1&/
替换下一个。\n
\ntest1\n
最后一个表达式类似,但引入了一个叫做捕获的东西。捕获让您仍然可以匹配所有内容,但保留所有内容以供在表达式的替换部分使用\(
。\)
例如s/a\(b\)c\(d\)e/\1 \2/
,b d
如果给定输入字符串abcde
. 在示例中,\1
和\2
分别替换为转义括号中捕获的内容,b
和d
。
s
- 这是一个替换模式:
/
- 寻找
\(
- 并放入\1
替换变量
.
- 任何事物
*
- 以及任何数量
\n
- 包括您遇到的第一个换行符
\)
- (捕获结束\1
)
\(
- 并放入\2
替换变量
.
- 任何事物
*
- 以及任何数量
\n
- 包括您遇到的第一个换行符
\)
- (捕获结束\2
)
/
- 并将其全部替换为
\1
- 捕获的第一件事,
test2\n
- 测试2\n,
\2
- 第二件事被抓住了。