我有以下字符串,在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中打印相同的输出。
答案 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,}