2

I need to run a regular expression to match part of a string. On OS X I would do:

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

However, this use of sed isn't compatible with other platforms, many of which would invoke the same command using sed -r.

So what I'm looking for is either a good way to detect which option to use, or a widely available (and compatible) alternative to sed that I can try to do the same thing (retrieve part of a string using a pattern).

4

3 回答 3

5

还有诸如 awk、perl、tr 甚至纯 bash 之类的替代方案。这取决于你想做什么。

但是,对于您的情况,您实际上并不需要-Esed 的特殊正则表达式标志。你可以做:

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

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

于 2013-07-08T18:22:56.417 回答
3

这确实令人难以置信的烦人。我做类似的事情:

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

于 2013-07-08T18:24:39.277 回答
1

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

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

-e表明sed-script 如下;可以省略。

如果做不到这一点,Perl 在某种程度上是sed替代品(仍然有一个程序s2p可以将sed脚本转换为 Perl 脚本)。

perl -e 'foreach (@ARGV) { s/blah(.*)blah/$1/; print "$_\n"; }' "$string"
于 2013-07-08T18:24:09.387 回答