【发布时间】:2021-11-15 17:19:13
【问题描述】:
我的文档中有几行看起来像这样:
foo-bar-foo[Foo - Bar]
我想选择每个 - 字符,直到每行的第一个 [ 括号。因此不应选择方括号中的-。
我怎样才能用正则表达式实现这一点?
我已经有了这个正则表达式/.+?(?=\[)/g,它会选择每个字符直到第一个[,但我只想要-。
编辑:我想用sed 命令(GNU)替换这些选定的字符。
【问题讨论】:
我的文档中有几行看起来像这样:
foo-bar-foo[Foo - Bar]
我想选择每个 - 字符,直到每行的第一个 [ 括号。因此不应选择方括号中的-。
我怎样才能用正则表达式实现这一点?
我已经有了这个正则表达式/.+?(?=\[)/g,它会选择每个字符直到第一个[,但我只想要-。
编辑:我想用sed 命令(GNU)替换这些选定的字符。
【问题讨论】:
你可以使用
sed -E ':a; s/^([^[-]+)-/\1/; ta'
查看online demo:
#!/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 标签【讨论】: