2012-09-20 152 views
1

我有一個名爲$字符串鞏固sed命令

string='-d $DESTDIR/ERRORS/$BASEDIR ]] || $MKDIR -p  word1 word22 word3.5' 

目前,我通過兩次的sed管道此字符串。一次拉出特殊字符,然後再將空格/製表符更改爲單個空格。

echo $string | sed 's/[^a-zA-Z0-9]/ /g' | sed 's/\s\s*/ /g' 
output='d DESTDIR ERRORS BASEDIR MKDIR p word1 word22 word3 5' 

雖然這個工程,我期待獲得一些效率。 有人可以幫我鞏固一個單一的sed命令嗎?

編輯 我應該指出,這必須是POSIX的HP/SOL/LIN

回答

1

兼容試試這個:

echo $string | sed -r 's/[^[:alnum:]]/ /g;s/ +/ /g' 

大師。

+0

'[[:alnum:]]'是語言環境敏感。 –

+0

我的'sed'沒有'-r' ...你可以不使用它來編寫它嗎? – nneonneo

+0

-r是需要鞏固的空間...我也沒有在惠普或SOL – nitrobass24

2

使用tr

echo $string | tr -Cs a-zA-Z0-9 ' ' 

tr是翻譯,刪除和擠壓字符一個非常強大的(和快速)的工具。

該特定命令將第一組(a-zA-Z0-9)的C補碼的每個字符轉換爲來自第二組的字符;由於第二組僅包含空格,因此將所有非字母數字字符(包括製表符)轉換爲空格。然後s將來自第二個字符集的所有字符序列排列成單個字符;這取代了單空格的空間運行。

實施例:

$ string='-d $DESTDIR/ERRORS/$BASEDIR ]] || $MKDIR -p  word1 word22 word3.5' 
$ output=$(echo $string | tr -Cs 'a-zA-Z0-9' ' ') 
$ echo $output 
d DESTDIR ERRORS BASEDIR MKDIR p word1 word22 word3 5 
+0

從未使用tr ...是posix兼容嗎? – nitrobass24

+0

是的,來自'man tr':* tr實用程序符合IEEE Std 1003.1-2001('POSIX.1')。* – nneonneo

+0

經過多次測試後,它不像我的HP或Solaris機箱上的「C」。我嘗試過「c」,但這並不會產生相同的結果。 – nitrobass24