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

Regex 为什么我在eshell的sed会得到奇怪的结果?,regex,character-encoding,sed,eshell,Regex,Character Encoding,Sed,Eshell,我无法将“发现”的结果传送到sed。我把它简化为我能打破的最简单的东西,我得到了这个: echo 1234567890abcdefghijklmnopqrstuvwxyz | sed 's/[:digit:]*/X/g' 我希望得到: Xabcdefghijklmnopqrstuvwxyz 我从中得到的结果是: X1X2X3X4X5X6X7X8X9X0XaXbXcXeXfXhXjXkXlXmXnXoXpXqXrXsXuXvXwXxXyXzX 这不是我所期望的。如果我将正则表达式更改为: e

我无法将“发现”的结果传送到sed。我把它简化为我能打破的最简单的东西,我得到了这个:

echo 1234567890abcdefghijklmnopqrstuvwxyz | sed 's/[:digit:]*/X/g'
我希望得到:

Xabcdefghijklmnopqrstuvwxyz
我从中得到的结果是:

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

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

XaXbXcXdXeXfXgXhXiXjXkXlXmXnXoXpXqXrXsXtXuXvXwXxXyXzX

这与我的预期更接近。我刚刚意识到我在标准终端上没有这个问题,只有在aquamacs eshell中。。。我想这一定是字符编码问题吧?可能和unicode有关?如何确定这一点,以及如何解决此问题?

第一个问题的答案是字符类[:digit:]本身需要包含在[]中,因此它应该是[:digit:]


仍在处理第二部分。

请记住,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
如果这两项都不起作用,请编辑您的问题,将您需要的内容作为输出

我希望这有帮助

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


\1是.*除[:digit:][/p>之外的任何字母,您希望第二个示例中的xaxbxxdxexf…?我也使用Aquamacs,无论是在Eshell还是在Terminal中都可以得到相同的输出。我添加了我期望得到的结果。这在你的Eshell中不起作用吗?Arg。没有注意到你回答了自己的问题。第二部分有用吗。祝你好运。我现在明白了。我不知道为什么它在学期和早些时候的埃舍尔身上似乎不起作用。因为我漏掉了第一个[[:digit:]我从未将所有的#替换为一个X,而没有字母之间的所有0 X。通过剪切和粘贴到一个术语中,有时你可能会得到空格、制表符和其他不可见的字符,这些字符摆脱了sed reg ex;-)的敏感特性。这是我最好的猜测。如果历史缓冲区中仍然有失败的命令,可能是
echo…|od-m x-ansi
可以帮助您调试它。感谢您接受并投票!祝你好运