正则表达式:select 每次出现一个字符直到另一个字符

Regex: select each occurrence of a character up until another character

我在文档中有几行看起来像这样:

foo-bar-foo[Foo - Bar]

我想 select 每 - 个字符,直到每行的第一个 [ 括号。因此方括号中的 - 不应 selected.

如何使用 Regex 实现?

我已经有了这个正则表达式 /.+?(?=\[)/g,它 select 包含第一个 [ 之前的每个字符,但我只想要 -.

编辑:我想用 sed 命令 (GNU) 替换这些 selected 字符。

您可以使用

sed -E ':a; s/^([^[-]+)-//; ta'

看到一个 online demo:

#!/bin/bash
s='foo-bar-foo[Foo - Bar]'
sed -E ':a; s/^([^[-]+)-//; ta' <<< "$s"
# => foobarfoo[Foo - Bar]

详情:

  • -E - 启用 POSIX ERE 语法(因此无需转义捕获括号和 + 量词)
  • :a - a 标签
  • s/^([^[-]+)-// - 从字符串的开头找到除 [- 之外的一个或多个字符,将此子字符串捕获到组 1 (</code>) 中,然后进行匹配一个 <code>- 字符
  • ta - 成功替换后跳转到 a 标签