Почему я получаю странные результаты с sed в eshell? - PullRequest
2 голосов
/ 20 ноября 2011

У меня были проблемы с передачей результатов поиска.Я упростил это до самой простой вещи, которую я мог сломать, и я получил это:

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

Я ожидал получить:

Xabcdefghijklmnopqrstuvwxyz

Вывод, который я получил из этого:

X1X2X3X4X5X6X7X8X9X0XaXbXcXeXfXhXjXkXlXmXnXoXpXqXrXsXuXvXwXxXyXzX

что не то, что я ожидал.Если я изменю свое регулярное выражение на:

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

, я получу:

XaXbXcXdXeXfXgXhXiXjXkXlXmXnXoXpXqXrXsXtXuXvXwXxXyXzX

, что ближе к тому, что я ожидал.Я только что понял, что у меня нет этой проблемы в стандартном терминале, только в Aquamacs Eshell ... Я предполагаю, что это проблема кодировки символов?Может быть, Юникод связан?Как я могу точно определить это и как я могу решить эту проблему?

Ответы [ 3 ]

2 голосов
/ 21 ноября 2011

Помните, что reg-exp char '*' означает 'match zero или больше предыдущего 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 голос
/ 21 ноября 2011

Ответом за номер один является то, что сам класс символов [: digit:] должен быть заключен в [], поэтому он должен быть [[: digit:]].

Все еще работает над второй частью.

0 голосов
/ 23 ноября 2011
echo 1234567890abcdefghijklmnopqrstuvwxyz | sed 's/[0-9]\+\(.*\)/X\1/g'

[0-9] + соответствует 1234567890

\ 1 - это. * Любая буква, кроме [: digit:]

...