【问题标题】:OS X 'RE error: invalid repetition count(s)'OS X 'RE 错误:重复计数无效'
【发布时间】:2018-11-16 16:26:12
【问题描述】:

我正在尝试替换以下内容(以最简单的形式)

{filedir_9}file.jpg

{filedir_7}file.jpg

使用

sed -i -e 's/(\{filedir_9\})([a-z\-\_0-9]+).jpg/\{filedir_7\}$2$3/g'

但我得到:RE 错误:重复计数无效

【问题讨论】:

  • 试试sed -i '' -e 's/{filedir_9}\([-a-z_0-9]\{2,\}\)\.jpg/{filedir_7}\1/g'。如果您尝试捕获两个子模式,为什么要使用 Group 3 占位符?请注意,\{ 在 POSIX BRE 模式中打开一个限制量词,您需要 { 来匹配文字 {。要创建捕获组,您需要\(...\),而不是(...),并且在替换中,您应该使用\1 来引用组1 值。在 POSIX 模式中,不支持括号表达式内的转义序列,您应该将 - 放在模式的开始/结束处,转义它不起作用。
  • 谢谢你,这帮助我得到了我需要的东西
  • 我发布了一个带有更多解释的答案。

标签: regex macos sed


【解决方案1】:

你可以使用

sed -i '' -e 's/{filedir_9}\([-a-z_0-9]\{2,\}\)\.jpg/{filedir_7}\1/g'

请注意,\{ 在 POSIX BRE 模式中打开一个限制量词,您需要 { 来匹配文字 {

要以 BRE POSIX 模式创建捕获组,您需要 \(...\),而不是 (...),并且在替换中,您应该使用 \1 来引用 Group 1 值。

在 POSIX 模式中,不支持括号表达式内的转义序列,您应该将 - 放在模式的开头/结尾,转义它不起作用(\ 被视为文字 \ 字符)。

另外,要匹配一个点,你需要对模式中的. 字符进行转义,如果它未转义,则匹配任何字符。

在替换字符串中,您应该使用\1 而不是$1(类似Perl 的占位符)。请注意,您正在对第 2 组和第 3 组使用占位符,而您的 (\{filedir_9\})([a-z\-\_0-9]+).jpg 模式仅尝试捕获 2 个子字符串,因此没有第 3 组(因此,使用 $3\3 没有意义,它是空的)。

【讨论】:

猜你喜欢
  • 2021-03-18
  • 2013-10-15
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
  • 2017-11-20
相关资源
最近更新 更多