Regex sed扩展正则表达式的替代方案

Regex sed扩展正则表达式的替代方案,regex,shell,sed,Regex,Shell,Sed,我需要运行正则表达式来匹配字符串的一部分。在OS X上,我会: echo "$string" | sed -E 's/blah(.*)blah/\1/g' 但是,这种使用sed的方式与其他平台不兼容,许多平台会使用sed-r调用相同的命令 因此,我要寻找的要么是一种检测要使用哪个选项的好方法,要么是一种广泛可用(且兼容)的替代方法,我可以尝试做同样的事情(使用模式检索字符串的一部分)。有类似于awk、perl、tr甚至纯bash的替代方法。这取决于你想做什么 然而,对于您的情况,您并不真正需要

我需要运行正则表达式来匹配字符串的一部分。在OS X上,我会:

echo "$string" | sed -E 's/blah(.*)blah/\1/g'
但是,这种使用
sed
的方式与其他平台不兼容,许多平台会使用
sed-r
调用相同的命令


因此,我要寻找的要么是一种检测要使用哪个选项的好方法,要么是一种广泛可用(且兼容)的替代方法,我可以尝试做同样的事情(使用模式检索字符串的一部分)。

有类似于awk、perl、tr甚至纯bash的替代方法。这取决于你想做什么

然而,对于您的情况,您并不真正需要sed的特殊regex标志
-E
。你可以做:

sed 's/blah\(.*\)blah/\1/g'

使其与其他平台上的sed兼容。

有awk、perl、tr甚至纯bash等替代方案。这取决于你想做什么

然而,对于您的情况,您并不真正需要sed的特殊regex标志
-E
。你可以做:

sed 's/blah\(.*\)blah/\1/g'

要使其与其他平台上的sed兼容。

到目前为止,使用
sed
的最佳解决方案是使用可移植(POSIX)基本正则表达式等价物,它将在所有平台上工作:

echo "$string" | sed -e 's/blah\(.*\)blah/\1/g'
-e
指示下面的
sed
-脚本;可以省略

如果不能做到这一点,Perl只是部分的
sed
替代品(仍然有一个程序
s2p
sed
脚本转换为Perl脚本)


到目前为止,使用
sed
的最佳解决方案是使用可移植(POSIX)基本正则表达式等价物,它可以在所有平台上工作:

echo "$string" | sed -e 's/blah\(.*\)blah/\1/g'
-e
指示下面的
sed
-脚本;可以省略

如果不能做到这一点,Perl只是部分的
sed
替代品(仍然有一个程序
s2p
sed
脚本转换为Perl脚本)


这真是令人讨厌。我会这样做:

SED_EXTENDED_REGEXP_FLAG=-r
case $(uname)
in
    *BSD) SED_EXTENDED_REGEXP_FLAG=-E ;;
    Darwin) SED_EXTENDED_REGEXP_FLAG=-E ;;
esac

echo "$string" | sed $SED_EXTENDED_REGEXP_FLAG 's/blah(.*)blah/\1/g'
这是我的想法,如果shell脚本语法有点不正确,我深表歉意


这假设任何不是BSD或OS X的平台都有GNU sed(或另一个sed,其中
-r
是扩展正则表达式的标志,如果有这样的东西的话)。

这确实令人非常恼火。我会这样做:

SED_EXTENDED_REGEXP_FLAG=-r
case $(uname)
in
    *BSD) SED_EXTENDED_REGEXP_FLAG=-E ;;
    Darwin) SED_EXTENDED_REGEXP_FLAG=-E ;;
esac

echo "$string" | sed $SED_EXTENDED_REGEXP_FLAG 's/blah(.*)blah/\1/g'
这是我的想法,如果shell脚本语法有点不正确,我深表歉意


这假设任何不是BSD或OS X的平台都有GNU sed(或另一个sed,其中
-r
是扩展正则表达式的标志,如果有这样的标志)。

真的吗?该死看起来我还有很多其他的脚本要修改!虽然这不是对我的问题的最直接的回答,但我认为这是最正确的,因为出于某种原因,我(错误地)认为我需要特殊的正则表达式来使用子模式,但没有意识到你刚刚逃脱了它们!谢谢真正地该死看起来我还有很多其他的脚本要修改!虽然这不是对我的问题的最直接的回答,但我认为这是最正确的,因为出于某种原因,我(错误地)认为我需要特殊的正则表达式来使用子模式,但没有意识到你刚刚逃脱了它们!谢谢谢谢你的回复!在某些方面,这是对我所问问题的最直接的回答,无论如何都值得知道,但我认为@anubhava的回答是我实际应该在我的案例中使用的,所以我将其标记为答案。谢谢你!谢谢你的回复!在某些方面,这是对我所问问题的最直接的回答,无论如何都值得知道,但我认为@anubhava的回答是我实际应该在我的案例中使用的,所以我将其标记为答案。谢谢你!