簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM