gpt4 book ai didi

regex - 需要帮助理解 sed 中的这个正则表达式

转载 作者:IT王子 更新时间:2023-10-29 01:23:43 26 4
gpt4 key购买 nike

我发布了 this question有人用这个回答

sed '/^void.*{$/!b;:a;/\n}$/bb;$!{N;ba};:b;s/\n/&test1&/;s/\(.*\n\)\(.*\n\)/\1test2\n\2/' 文件

我是 sed 和正则表达式的新手,无法理解每个部分的功能。

我会尝试解释我所理解的,你们可以填补缺失的东西。我将逐个字符地进行

  1. ^void.*{$ -- 这意味着任何以 void 开头并以 {
  2. 结尾的内容
  3. /!b; 我不明白这是做什么的。现在 b 用于分支/ 在那里做什么
  4. :a; 用于制作标签a
  5. /\n 还是没看懂/那里
  6. }$结尾
  7. /bb 我不明白
  8. $! 表示如果不是文件结尾
  9. {N; 没明白是什么意思,N的意思是复制buffer中的下一行但是确实得到了{
  10. :b 没听懂。 b 用于分支但不知道它在那里做什么10.s/\n/&test1&/ 我认为它将\n 替换为 \ntest1\n 但不确定
  11. s/\(.*\n\)\(.*\n\)/\1test2\n\2/ 也不要得到这个

最佳答案

您可以将多个 sed 表达式与 ; 字符链接在一起。下面分别看一下每一个。

第一个表达式 /^void.*{$/!b 在分隔符 / 之间有一个匹配器表达式。它匹配:

^ - 行首

void - 后跟字符“void”

.* - 后跟任何内容

{ - 后跟左 curl

$ - 后跟行尾

第一个表达式中的修饰符 !b 表示如果匹配器不匹配,则中止 sed 评估。

:a 表达式是一个标签。它与称为分支的类似于 goto 的 sed 功能一起使用。我们将看到如何在下一个表达式中使用标签。

表达式 /\n}$/bb 匹配:

\n - 换行符

} - 后跟右 curl

$ - 后跟行尾

修饰符bb 表示如果找到匹配项,则“分支”到标签b。标签 b 在后面的表达式中定义为 :b

$!{N;ba} 表达式应该被读作一个,即使它中间有一个 ;。本例中的 curl 代表一系列旨在一起执行的命令。

$! - 如果不是输入结束

{ - 开始命令组(在本例中,有两个)

N - 默读另一行

ba - 标记 a 的分支

} - 结束命令组

接下来是标签 :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 被替换为转义括号中捕获的内容,bd,分别。

s - 这是一个替换模式:

/ - 查找

\( - 并放入 \1 替换变量

. - 任何内容

* - 以及任意数量

\n - 包括您遇到的第一个换行符

\) -(\1 的捕获结束)

\( - 并放入 \2 替换变量

. - 任何内容

* - 以及任意数量

\n - 包括您遇到的第一个换行符

\) -(\2 的捕获结束)

/ - 并将其全部替换为

\1 - 捕获的第一个东西,

test2\n - test2\n,

\2 - 捕获的第二个东西。

关于regex - 需要帮助理解 sed 中的这个正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14226933/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com