1

Я обнаружил, что sed часто не соответствует шаблону. Рассмотрим следующие примеры:

echo 'A     B     C' | sed 's/[ \t]*//g'
ABC

echo -e 'A\tB\tC' | sed 's/[ \t]*//g'
A       B       C

perl -e 'print "A     B     C\n"' | sed 's/[ \t]*//g'
ABC

perl -e 'print "A\tB\tC\n"' | sed 's/[ \t]*//g'
A       B       C

Может кто-нибудь объяснить, почему sed иногда не соответствует пробелу?

4 ответа4

3

1.

echo -e 'A\tB\tC' | sed 's/[ \t]*//g'
A       B       C

Работает для меня

$ echo -e 'A\tB\tC' | sed 's/[ \t]*//g'
ABC

Попробуй это

$ echo -e 'a\tb' | sed -e 's/[ \t]//'
ab

2.

perl -e 'print "A     B     C\n"' | sed 's/^[ \t]*//g'
A       B       C

ваша строка не содержит пробела в начале (^) строки

1

Некоторые версии sed не поддерживают \t а некоторые другие экранированные символы находятся слева от команды подстановки.

Вы можете найти информацию о вариациях версий sed в FAQ.

0

Второе утверждение, которое у вас есть, работает на моей машине (Ubuntu 10.10 amd64, sed ver 4.2.1, версия пакета sed 4.2.1-7), и у меня нет объяснения, почему это не сработает.

Третий и четвертый из-за того, что вы используете якорь начала строки (^), поэтому он удалит только начальные пробелы и во входном тексте у вас не будет пробелов в начале строк.

0

Вы должны использовать \s для сопоставления пробелов и табуляции:

echo 'A     B     C' | sed 's/\s//g'
ABC

echo -e 'A\tB\tC' | sed 's/\s//g'
ABC

perl -e 'print "A     B     C\n"' | sed 's/\s//g'
ABC

perl -e 'print "A\tB\tC\n"' | sed 's/\s//g'
ABC

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .