在 SED 中用正则表达式匹配和替换 
Match and Replace  with Regex in SED
我正在尝试为 SED 编写 RegEx 以使其匹配并替换以下 MarkDown 文本:

与:

现在,在 PCRE 中,匹配模式将是:
([\!]|^)(\[.*\])(\(\/bar[\/])
在 Regex101 上测试:
但在 SED 上它是无效的。
我在提问之前尝试了很多 组合,但我快疯了,因为我不是 RegEx 专家。
为了 make the replacement with sed as described here?
匹配和拆分字符串 的正确 SED 正则表达式
您需要的 sed
命令应该是带有 -E
选项的 运行,因为您的正则表达式是 POSIX ERE 兼容的。也就是说,捕获括号应该是未转义的,而文字括号必须是转义的(如在 PCRE 中)。
您可以使用
sed -E 's;(!\[.*])(\(/uploads/);(uploads/;g'
详情
(!\[.*])
- 捕获组 1:
!
- 一个!
字符(如果你使用"..."
,你需要转义它)
\[.*]
- 一个 [
,然后是任何 0+ 个字符,然后是 ]
(\(/uploads/)
- 捕获组 2:
\(
- 一个 (
字符
/uploads/
- /uploads/
子串。
POSIX BRE 兼容模式(您当前模式的实际 "quick fix")看起来像
sed 's;\(!\|^\)\(\[.*](\)/\(uploads/\);;g'
请注意,\(...\)
定义捕获组,(
匹配文字 (
,\|
定义交替运算符。
详情
\(!\|^\)
- 捕获组 1:!
或字符串开头
\(\[.*](\)
- 捕获第 2 组:一个 [
,然后是 0+ 个字符,然后是 (
/
- 一个 /
字符
\(uploads/\)
- 捕获第 3 组:uploads/
子字符串
;
正则表达式定界符有助于消除 /
之前的转义 \
字符并使模式更具可读性。
我正在尝试为 SED 编写 RegEx 以使其匹配并替换以下 MarkDown 文本:

与:

现在,在 PCRE 中,匹配模式将是:
([\!]|^)(\[.*\])(\(\/bar[\/])
在 Regex101 上测试:
但在 SED 上它是无效的。
我在提问之前尝试了很多 组合,但我快疯了,因为我不是 RegEx 专家。
为了 make the replacement with sed as described here?
匹配和拆分字符串 的正确 SED 正则表达式您需要的 sed
命令应该是带有 -E
选项的 运行,因为您的正则表达式是 POSIX ERE 兼容的。也就是说,捕获括号应该是未转义的,而文字括号必须是转义的(如在 PCRE 中)。
您可以使用
sed -E 's;(!\[.*])(\(/uploads/);(uploads/;g'
详情
(!\[.*])
- 捕获组 1:!
- 一个!
字符(如果你使用"..."
,你需要转义它)\[.*]
- 一个[
,然后是任何 0+ 个字符,然后是]
(\(/uploads/)
- 捕获组 2:\(
- 一个(
字符/uploads/
-/uploads/
子串。
POSIX BRE 兼容模式(您当前模式的实际 "quick fix")看起来像
sed 's;\(!\|^\)\(\[.*](\)/\(uploads/\);;g'
请注意,\(...\)
定义捕获组,(
匹配文字 (
,\|
定义交替运算符。
详情
\(!\|^\)
- 捕获组 1:!
或字符串开头\(\[.*](\)
- 捕获第 2 组:一个[
,然后是 0+ 个字符,然后是(
/
- 一个/
字符\(uploads/\)
- 捕获第 3 组:uploads/
子字符串
;
正则表达式定界符有助于消除 /
之前的转义 \
字符并使模式更具可读性。