[英]sed command not working properly in solaris but working in linux
我有以下字符串,在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)
我的solaris ,sed搜索不工作返回完整的字符串,無論搜索字符串匹配。
echo $string | sed -e 's/.*CREATESETTABLE[^)]\+TABLENAME\(.*\)/\1/g'
CREATESETTABLEDATABASE1.TABLE1(uid)CREATESETTABLEDATABASE1.TABLENAMEuid,cid,mid)DATABASE2.TABLENAME(hi,hello)
我希望在solaris中打印相同的輸出。
我相信\\+
即使在BSD上也不適用於舊的sed,它不受支持。 試試這個sed:
sed -e 's/.*CREATESETTABLE[^)]*TABLENAME\(.*\)/\1/g'
POSIX sed
僅支持BRE (基本正則表達式),其中+
沒有特殊含義 。
關於BRE的一個重要的奇怪之處(相對而言)是()
和{}
需要 \\
-escaping以獲得它們的特殊含義。 那些字符, 只有那些字符,需要這樣的轉義。 在當代(ERE)表達式中需要相反的情況, \\
取消它們需要禁用它們的特殊含義。
規范未定義 BRE中轉義( \\
)非特殊字符的行為。
你的問題源於這樣的事實: \\+
(和\\?
和\\|
在\\(\\)
)是GNU擴展 。
這些BRE擴展保留了\\
前綴的約定,但是當GNU sed
給出選項-r
,它將啟用ERE(擴展正則表達式),其中+
具有其現代意義(相當於{1,}
)以及對它的要求額外\\
被刪除。 同樣,標准BRE沒有特殊含義?
(或\\?
相當於{0,1}
),此功能也使用-r
啟用。
如果您使用GNU sed --posix
選項,這將禁用各種GNU擴展,並且您的腳本通常應該更加可移植(盡管可能更復雜)。 好吧,在GNU sed 4.2(2009年4月)之前--posix
選項沒有禁用所有BRE擴展,你應該確保使用最新版本,以便非POSIX功能不會進入。
實現您想要的最便攜的方式是使用{1,}
:
echo $string | sed --posix -e 's/.*CREATESETTABLE[^)]\{1,\}TABLENAME\(.*\)/\1/g'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.