我需要运行正则表达式来匹配字符串的一部分。在OS X上我会这样做:
echo "$string" | sed -E 's/blah(.*)blah/\1/g'
但是,sed
的这种使用与其他平台不兼容,其中许多平台会使用sed -r
调用相同的命令。
所以我正在寻找的是检测使用哪个选项的好方法,或者sed
的广泛可用(兼容)替代方案,我可以尝试做同样的事情(检索使用模式的字符串的一部分。)
答案 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"