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

时间:2017-06-29 13:49:40

标签: regex macos sed

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

我尝试过以下代码:

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

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

我该如何处理?

2 个答案:

答案 0 :(得分:1)

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

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

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

POSIX BRE模式详细信息

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

答案 1 :(得分:0)

您需要脚本有多强大?所有的例子都是一组括号还是一些嵌套?嵌套可能在实践中可行,在sed中可靠地难以做到。我们应该考虑在字符串和括号中加括号吗?不替换它们?如果是这样的话,你会有一个相当大的兔子洞,可能是不可能的。

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

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

说明:

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

sed substitute命令在每行中搜索正则表达式并按指定替换它。 g选项表示“全局”替换意味着它替换了一行中的所有出现,而不仅仅是第一行。

(\([^)]*\))

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

[\1]

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

任何与正则表达式不匹配的文本都保持不变。