我正在尝试为SED写一个RegEx,以使其匹配并替换以下MarkDown文本:
![something](/uploads/somethingelse)
具有:
![something](uploads/somethingelse)
现在,在PCRE中,匹配模式为:
([\!]|^)(\[.*\])(\(\/bar[\/])
在Regex101上测试:
但在SED上无效。
在询问之前,我已经尝试过很多组合,但是由于我不是RegEx专家,所以我会发疯。
哪个是正确的SED正则表达式,用于匹配并分割该字符串,以便进行make the replacement with sed as described here?
答案 0 :(得分:1)
您所需的sed
命令应使用-E
选项运行,因为您的正则表达式符合POSIX ERE。也就是说,捕获括号应不转义,而括号必须转义(如在PCRE中一样)。
您可以使用
sed -E 's;(!\[.*])(\(/uploads/);\1(uploads/;g'
详细信息
(!\[.*])
-捕获组1:
!
-一个!
字符(如果使用"..."
,则需要对其进行转义)\[.*]
-一个[
,然后是0+字符,然后是]
(\(/uploads/)
-捕获组2:
\(
-一个(
字符/uploads/
-一个/uploads/
子字符串。与POSIX BRE兼容的模式(当前模式的实际“快速修复”)看起来像
sed 's;\(!\|^\)\(\[.*](\)/\(uploads/\);\1\2\3;g'
请注意,\(...\)
定义捕获组,(
匹配文字(
,\|
定义交替运算符。
详细信息
\(!\|^\)
-捕获组1:!
或字符串的开头\(\[.*](\)
-捕获第2组:一个[
,然后是0个字符,然后是(
/
-一个/
字符\(uploads/\)
-捕获组3:uploads/
子字符串 ;
正则表达式定界符有助于消除在\
之前转义的/
个字符,并使模式更具可读性。