您可以将多个 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- 第二件事被抓住了。