2015-07-20 136 views
3

我是shell腳本和sed命令的新手。sed命令在solaris中工作,但在Linux中不工作

以下sed命令工作在Solaris中,但在Linux中給錯誤:

sed -n 's/^[a-zA-z0-9][a-zA-z0-9]*[ ][ ]*\([0-9][0-9]*\).*[/]dir1[/]subdir1\).*/\2:\1/p' 

的錯誤是

sed: -e expression #1, char 79: Invalid range end 

我不知道爲什麼它給無效範圍終點誤差。

+2

字符範圍'A-z'包含**所有**字符,其中ASCII值介於'A'和'z'之間。這包括上下級的alpha,以及'''''''',''''''','^','_'和反引號。這可能不是故意的,是嗎? –

+0

@拉馬先生是的,這不是故意的。它現在正在工作,一旦我改變Az到AZ – Hello

+0

'[a-zA-z0-9]'相當於'[[:alnum:]]'(是的,帶有雙括號) –

回答

5

看起來像Linux Sed不喜歡你的A-z(兩次)。無論如何,這並沒有什麼意義。

使用[A-Z](大寫Z)

+0

謝謝..它正在處理大寫字母Z.看起來solaris的解釋與Linux不同 – Hello

3

正如blue112說,A-z爲一個範圍是沒有意義的。 Solaris sed將其解釋爲「通過z的ASCII代碼爲A的ASCII碼」,在這種情況下,您可能會發生意外的匹配。 A-Z出現在ASCII碼a-z之前,但有幾個字符落在Za之間。

59 Y 
5a Z 
---- 
5b [ 
5c \ 
5d ] 
5e^
5f _ 
60 ` 
---- 
61 a 
62 b 

以下是顯示Solaris sed(本例中爲Solaris 8)的示例。考慮到這個範圍,它會替代_\以及您明顯定位的字母。

% echo "f3oo_Ba\\r" | /usr/bin/sed 's/[A-z]/./g';echo 
.3..... 

(注意3不會被替換,因爲它不屬於指定的ASCII範圍。)

GNU sed的是保護你從錯誤搬起石頭砸自己的腳。

相關問題