2011-11-20 72 views
2

我在查找sed的結果時遇到了麻煩。我把它簡化爲我就能把最簡單的事情,我得到這個:爲什麼我在eshell中獲得sed的奇怪結果?

echo 1234567890abcdefghijklmnopqrstuvwxyz | sed 's/[:digit:]*/X/g' 

我有望獲得:

Xabcdefghijklmnopqrstuvwxyz 

輸出我從這個得到的是:

X1X2X3X4X5X6X7X8X9X0XaXbXcXeXfXhXjXkXlXmXnXoXpXqXrXsXuXvXwXxXyXzX 

這不是我所期望的。如果我改變我的正則表達式:

echo 1234567890abcdefghijklmnopqrstuvwxyz | sed 's/[0-9]*/X/g' 

我得到:

XaXbXcXdXeXfXgXhXiXjXkXlXmXnXoXpXqXrXsXtXuXvXwXxXyXzX 

更接近我所期望的。我只是意識到我在標準終端中沒有這個問題,只有在aquamacs eshell中...我認爲它必須是字符編碼問題?也許unicode相關?我如何確定這一點,以及如何解決這個問題?

+0

你有什麼期望準確而不是你的第二個例子中' XaXbXcXdXeXf ...'?我也使用Aquamacs,並獲得相同的輸出,無論是在Eshell或終端。 –

回答

2

記住REG-EXP字符「*」表示「以上的前一個字符的」(在這種情況下,焦炭類)

而作爲@SamHoice注意,你需要「[[:數字:]]'。

所以,你可以減少所有數字在一排1 X

echo 1234567890abcdefghijklmnopqrstuvwxyz | sed 's/[[:digit:]][[:digit:]]*/X/g' 
Xabcdefghijklmnopqrstuvwxyz 

或替代X全部位數

echo 1234567890abcdefghijklmnopqrstuvwxyz | sed 's/[[:digit:]]/X/g' 
XXXXXXXXXXabcdefghijklmnopqrstuvwxyz 

如果沒有這些工作,請編輯您的問題,包括你需要作爲你的輸出。

我希望這會有所幫助。

+0

我加了我期望得到的。 –

+0

這不適用於你的eshell?精氨酸。沒有注意到你回答了你自己的問題。第2部分有幫助嗎? 。祝你好運。 – shellter

+0

好的。我現在知道了。我不知道爲什麼它在前期和後期似乎沒有相同的工作。因爲我忽略了第一個[[:digit:]],所以我沒有把所有的#s代入一個X,而在這些字母之間沒有所有的0 X. –

1

第一個問題的答案是,字符類[:digit:]本身需要包含在[]中,所以它應該是[[:digit:]]。

仍然在第二部分工作。

0
echo 1234567890abcdefghijklmnopqrstuvwxyz | sed 's/[0-9]\+\(.*\)/X\1/g' 

[0-9] +匹配1234567890

\ 1是*任意字母,除了[:數字:]

相關問題