将圆括号中的文本替换为方括号中的相同文本的最佳方法是什么?



我正在尝试使用 Mac 上的 sed 对 ('id') 等字符串进行全局查找/替换,['id']。我无法将正确的正则表达式放在一起以正确匹配括号而不会导致语法错误。我也不一定对使用 sed 感兴趣,这似乎是最好的方法。

我尝试了以下代码:

sed -i "" "s/(['].*['])/[1]/g" file.txt

sed -i "" "s/[(]['].*['][)]/[1]/g" file.txt

我应该如何处理这个问题?

假设('')之间没有',您可以使用

sed "s/(('[^']*'))/[1]/g"

关键是BRE POSIX正则表达式模式中的捕获组必须用(...)声明,而()表示文字()符号。 [^']*匹配除 ' 以外的零个或多个符号。

POSIX BRE 模式详细信息

  • ( - 文字(符号
  • ('[^']*') - 捕获组匹配:
    • ' - 单引号
    • [^']* - 一个否定的括号表达式,匹配除 ' 以外的零个或多个 (*( 个字符,然后
    • ' - 单引号
  • ) - 文字)符号。

您需要脚本有多强大? 所有示例都是一组括号还是嵌套的?嵌套在实践中可能是可能的,但事实证明很难在 sed 中健壮地做到。我们是否应该考虑在字符串中使用括号而不是替换它们?如果是这样,你就有一个相当多的兔子洞要下去/可能是不可能的。

这是一个相当简单的假设最简单的情况:

sed 's/(([^)]*))/[1]/g' test.tmp

解释:

sed 's/<find>/<replace>/g'

sed 替换命令在每行中搜索正则表达式,并按指定替换它。g选项表示"全局"替换,这意味着它替换一行上的所有匹配项,而不仅仅是第一个。

(([^)]*))

外部括号与您希望替换的括号匹配。内部转义括号,(),在要保留的文本周围创建一个组。 [^)]匹配任何不是)的字符,而以下*告诉我们匹配 0+ 这样的字符。

[1]

1表示我们之前形成的第一个(也是唯一的(组的内容,然后我们在其周围放置所需的方括号。

任何与正则表达式不匹配的文本都不会受到影响。

最新更新