sed удаление пробелов

sed удаление пробелов

Я обнаружил, что это 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иногда не удается сопоставить пробелы?

решение1

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

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

решение2

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

Информацию о различиях между версиями можно найти sedвЧасто задаваемые вопросы.

решение3

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

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

решение4

Вам следует использоватьдля соответствия как пробелу, так и табуляции:

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

Связанный контент