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

时间:2013-07-08 18:18:09

标签: regex shell sed

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

echo "$string" | sed -E 's/blah(.*)blah/\1/g'

但是,sed的这种使用与其他平台不兼容,其中许多平台会使用sed -r调用相同的命令。

所以我正在寻找的是检测使用哪个选项的好方法,或者sed的广泛可用(兼容)替代方案,我可以尝试做同样的事情(检索使用模式的字符串的一部分。)

3 个答案:

答案 0 :(得分:4)

还有其他选择,比如awk,perl,tr甚至是纯粹的bash。这取决于你想做什么。

但是对于你的情况,你真的不需要sed的特殊正则表达式-E。你可以这样做:

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

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

答案 1 :(得分:2)

这确实非常令人讨厌。我做了类似的事情:

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是扩展正则表达式的标志,如果有这样的话)。

答案 2 :(得分:1)

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

echo "$string" | sed -e 's/blah\(.*\)blah/\1/g'

-e表示sed - 脚本如下;它可以省略。

如果不这样做,Perl部分是sed替代品(还有一个程序s2p可以将sed脚本转换为Perl脚本。)

perl -e 'foreach (@ARGV) { s/blah(.*)blah/$1/; print "$_\n"; }' "$string"