gpt4 book ai didi

bash - 如何使用 sed 将成对的方括号替换为其他语法?

转载 作者:行者123 更新时间:2023-11-29 08:51:53 24 4
gpt4 key购买 nike

我想用 \macro{some text} 替换文件中的所有方括号对,例如 [some text],例如:

This is some [text].
This [line] has [some more] text.

这变成了:

This is some \macro{text}.
This \macro{line} has \macro{some more} text.
  • 对只出现在单独的行上,从不跨越多行。
  • 有时一行中可能有多个对,但它们绝不会嵌套。
  • 如果在一条直线上发现括号是单独的,没有一对,则不应更改它。

如何用这段代码替换这些括号对?

最佳答案

这花了一点时间,但是在这里:

sed -i.bkup  's/\[\([^]]*\)\]/\\macro{\1}/g' test.txt

让我们看看我能否解释这个正则表达式:

  1. \[ 匹配方括号。由于 [ 是一个有效的魔术正则表达式字符,反斜杠表示匹配文字字符。
  2. \(...\) 是一个捕获组。它捕获了我想要的正则表达式的一部分。我可以有很多捕获组,在 sed 中我可以将它们引用为 \1\2 等。
  3. 在捕获组 \(...\) 内。我有 [^]]*
    1. [^...] 语法表示任何字符但是。
    2. [^]] 表示除右括号外的任何字符。
    3. * 表示前面的零个或多个。这意味着我正在捕获零个或多个未关闭方括号的字符。
  4. \] 表示右方括号

让我们看一下 this is [some] more [text]

  • 在上面的 #1 中,我捕获了单词 some 前面的第一个左方括号。但是,它不在捕获组中。这是我要替换的第一个字符。
  • 我现在开始一个捕获组。我正在根据上面的 3.2 和 3.3 进行捕获,从 some 中的字母 s 开始,尽可能多的字符没有结束方括号。这意味着我正在匹配 [some,但只捕获 some
  • 在#4 中,我结束了捕获组。我已经为替换目的匹配了 [some,现在我在最后一个右方括号上匹配。这意味着我正在匹配 [some]。请注意,正则表达式通常是贪婪的。我将在下面解释为什么这很重要。
  • 现在,我可以匹配替换字符串了。这要容易得多。它是 \\macro(\1)\1 被我的捕获组取代。 \\ 只是一个反斜杠。因此,我会将 [some] 替换为 \macro{some}

如果我能保证在每一行中有一组方括号,那就容易多了。然后我可以这样做:

sed -i.bkup 's/\[\(.*\)\]/\\macro(\1)/g'

捕获组现在说方括号之间的任何内容。然而,问题是正则表达式是贪婪的,这意味着我会从 some 中的 s 一直匹配到最后的 t在文本中。下面的“x”显示捕获组。 [] 显示我匹配的方括号:

 this is [some] more [text]
[xxxxxxxxxxxxxxxx]

这变得更加复杂,因为我必须匹配对正则表达式具有特殊含义的字符,所以我们看到了很多反斜杠。另外,我必须考虑正则表达式的贪婪性,它得到了漂亮的非匹配字符串 [^]]* 来匹配任何不是右括号的内容。在\[[^]]*\]前后加上方括号,别忘了\(...\)捕获组:\[\([^]]*\)\]你会得到一个正则表达式的一大堆乱七八糟的东西。

关于bash - 如何使用 sed 将成对的方括号替换为其他语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10646418/

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