为什么我在eshell中使用sed会得到奇怪的结果?

时间:2011-11-20 19:49:13

标签: regex character-encoding sed eshell

我无法将'find'的结果传递给sed。我把它简化为最简单的事情,我得到了这个:

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

我希望得到:

Xabcdefghijklmnopqrstuvwxyz

我得到的输出是:

X1X2X3X4X5X6X7X8X9X0XaXbXcXeXfXhXjXkXlXmXnXoXpXqXrXsXuXvXwXxXyXzX

这不是我所期待的。如果我将我的正则表达式改为:

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

我明白了:

XaXbXcXdXeXfXgXhXiXjXkXlXmXnXoXpXqXrXsXtXuXvXwXxXyXzX

更接近我的预期。我刚刚意识到我在标准终端中没有这个问题,只在aquamacs eshell ...我认为它必须是字符编码问题?也许unicode相关?我如何确定这一点,以及如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

请记住,reg-exp char'*'表示'匹配或更多以前的char'(在本例中为char类)

正如@SamHoice所说,你需要'[[:digit:]]'。

所以你可以减少一行中的所有数字1 X

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

或者用X代替所有数字

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

如果这些都不起作用,请编辑您的问题以包含您输出所需的内容。

我希望这会有所帮助。

答案 1 :(得分:1)

第一个答案是字符类[:digit:]本身需要包含在[]中,所以它应该是[[:digit:]]。

仍然在第二部分工作。

答案 2 :(得分:0)

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

[0-9] +匹配1234567890

\ 1是。*任何字母,但[:digit:]

除外