2012-08-16 39 views
1

我想從線路捕捉特殊字符:捕捉特殊字符從線

var=`echo "#this is comment" | grep "[^a-zA-Z0-9 \t]"` 
echo $var 

預期輸出:#

但要:#this is comment

有人能幫助我。

回答

3

好像你想要更多的東西一樣:

var=`echo "#this is comment" | sed 's/[^a-zA-Z0-9 \t]//g;'` 

使用sed將替代字符;使用grep只搜索字符。

編輯:請注意,\t結構不能保證可移植到所有的系統或區域;我相信如果您的sed支持POSIX正則表達式,則使用[:space:]可能會更好。 (謝謝@ ghoti!)

+0

的'\ t'是不可移植,而被忽略在OSX,BSD,Solaris,HPUX等。OP沒有提到他的平臺。如果您想要包含標籤,請使用便攜式設備,或指定答案的限制。 – ghoti 2012-08-16 01:46:09

+0

好的,謝謝@ ghoti!我添加了關於限制的評論... – 2012-08-16 01:53:41

+0

'var ='echo「#this is comment」| | sed's/[a-zA-Z0-9 \ t] // g;'''很有魅力,感謝您的快速響應,您節省了我的時間。 – phani 2012-08-16 04:09:27

2
string="#this is comment" 
var=$(echo "$string" | sed 's/[a-zA-Z0-9 ]//g') 
echo "$var" 

我刪除了\t,因爲它不便攜。

如果你想使用awk要做到這一點,因爲你的標籤意味着,你可以使用類似:

var=$(echo "$string" | awk '{gsub(/[a-zA-Z0-9 ]/, "")} 1') 

注意,這些都可能好的方法來實現什麼,那就是你試圖去做。如果您發佈更多代碼,向我們展示一些背景信息,我們可以幫助您避免使用XY problem

當然,如果你願意,你也可以直接在bash中做這樣的替換。

var=${string//[A-Za-z0-9 ]} 

你會避免調用額外的程序時,你並不真的需要它節省CPU和時間。

+0

感謝您的解決方案。 – phani 2012-08-16 04:10:21

0

sed可用於這一點,但tr是一個更好的選擇:

echo "#this is comment" | tr -d 'a-zA-Z0-9 \t' 

tr還支持字符類,如[:space:][:alpha:]