2

我在将“查找”的结果传递给 sed 时遇到了麻烦。我将它简化为我可以打破的最简单的东西,我得到了这个:

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

我希望得到:

Xabcdefghijklmnopqrstuvwxyz

我从中得到的输出是:

X1X2X3X4X5X6X7X8X9X0XaXbXcXeXfXhXjXkXlXmXnXoXpXqXrXsXuXvXwXxXyXzX

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

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

我得到:

XaXbXcXdXeXfXgXhXiXjXkXlXmXnXoXpXqXrXsXtXuXvXwXxXyXzX

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

4

3 回答 3

2

请记住,reg-exp char '*' 表示“匹配前一个字符的个或多个”(在这种情况下为 char 类)

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

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

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

或用 X 代替所有数字

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

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

我希望这有帮助。

于 2011-11-20T21:01:30.010 回答
1

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

第二部分还在工作。

于 2011-11-20T20:09:17.940 回答
0
echo 1234567890abcdefghijklmnopqrstuvwxyz | sed 's/[0-9]\+\(.*\)/X\1/g'

[0-9]+匹配1234567890

\1 是 .* 任何字母,除了 [:digit:]

于 2011-11-23T10:56:04.983 回答