首页 > 解决方案 > 正则表达式:选择一个字符的每次出现直到另一个字符

问题描述

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

foo-bar-foo[Foo - Bar]

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

如何使用正则表达式实现这一目标?

我已经有了这个正则表达式/.+?(?=\[)/g,它选择每个字符直到第一个字符,[但我只想要-.

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

标签: regexsed

解决方案


您可以使用

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

查看在线演示

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

详情

  • -E- 启用 POSIX ERE 语法(这样就无需转义捕获括号和+量词)
  • :a-a标签
  • s/^([^[-]+)-/\1/- 找到一个或多个字符,而不是[-字符串的开头捕获此子字符串到组 1 ( \1) 中,然后匹配一个-字符
  • ta- 成功替换后跳转到a标签

推荐阅读