2011-11-20 176 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是*任意字母,除了[:数字:]

相关问题