Я обнаружил, что это 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