sed命令在solaris中无法正常工作但在linux中工作

时间:2014-03-14 12:22:06

标签: regex linux bash sed solaris

我有以下字符串,在sed命令中进一步使用。它在Linux中正常工作但不在Solaris中工作

  

-bash-3.00 $ string =" CREATESETTABLEDATABASE1.TABLE1(uid)CREATESETTABLEDATABASE1.TABLENAMEuid,cid,mid)DATABASE2.TABLENAME(嗨,你好)"

在Linux 框中,输出正确如下。

echo $string | sed -e 's/.*CREATESETTABLE[^)]\+TABLENAME\(.*\)/\1/g'
uid,cid,mid)DATABASE2.TABLENAME(hi,hello)

I solaris ,sed搜索无效,无论搜索字符串匹配如何都返回完整字符串。

echo $string | sed -e 's/.*CREATESETTABLE[^)]\+TABLENAME\(.*\)/\1/g'
CREATESETTABLEDATABASE1.TABLE1(uid)CREATESETTABLEDATABASE1.TABLENAMEuid,cid,mid)DATABASE2.TABLENAME(hi,hello)

我希望在solaris中打印相同的输出。

2 个答案:

答案 0 :(得分:2)

我相信即使在BSD上,\+也无法在旧的sed上运行,但它不受支持。试试这个sed:

sed -e 's/.*CREATESETTABLE[^)]*TABLENAME\(.*\)/\1/g'

答案 1 :(得分:0)

POSIX sed仅支持BRE(基本正则表达式),其中+ 没有特殊含义

关于BRE的一个重要的奇怪之处(相对而言)是(){} 需要 \ - 逃避以获得其特殊含义。这些字符和这些字符需要这样的转义。在当代(ERE)表达式中需要相反的情况,\ - 要求它们去除禁用它们的特殊含义。

BRE中转义(\)非特殊字符的行为是未定义规范。

您的问题源于\+\?以及\|内的\(\)GNU extensions这一事实。

这些BRE扩展保留了\前缀的约定,但是当GNU sed被赋予选项-r时,它将启用ERE(扩展正则表达式),其中{{1} }具有现代意义(相当于+),并且删除了对额外{1,}的要求。同样,标准BRE对\(或?,相当于\?)没有特殊含义,此功能也可以{0,1}启用。

如果你使用GNU sed -r选项,这将禁用各种GNU扩展,并且你的脚本通常应该更加可移植(尽管可能更复杂)。好吧,在GNU sed 4.2(2009年4月)之前,--posix选项没有禁用所有BRE扩展,你应该确保使用最新版本,以便非POSIX功能不会蔓延。

实现您想要的最便携的方法是--posix

{1,}