2009-11-20 5 views
2

Я использую следующий код, чтобы удалить оба ведущие и хвостохранилищ пробелы из всех строк файла a.txtПроблема в использовании Sed, чтобы удалить начальные и конечные пробелы

sed 's/^[ \t]*//;s/[ \t]*$//' ./A.txt > ./B.txt

Проблема возникает на линиях, где находится в начале или в конце. Так скажите, например, оригинальная строка, начинающаяся со строки «часовой пояс», становится «imezone»

Не могли бы вы рассказать мне, что здесь происходит? а также, если есть известное решение проблемы.

Заранее благодарен.

+0

Я просто попробовать ваш код и он работает, как вы ожидали. Не знаю, в чем проблема. – NawaMan

ответ

2

Вы можете повезти, если вы просто использовать пробельный класс символов:

sed -e 's/^\s*//' -e 's/\s*$//' A.txt > B.txt 
+1

К сожалению, если его sed настолько старый, что он не понимает \ t, он, вероятно, тоже не понимает. –

+0

Хороший вопрос ... Я не думал об этом. – jheddings

2

новых версии SED понимать \ т, но более старые версии могут не иметь. Вам может быть лучше заменить \ t на литеральную вкладку (CTRL-V даст вам это)

Какую версию sed вы используете в какой системе? (sed --version для GNU sed)

6

Некоторые старые версии sed не понимают escape-символы C-стиля, такие как \ t, и рассматривают это как два символа, '\' и 't'. Вы можете избежать проблемы, используя буквенный символ табуляции - если вы вводите это прямо в оболочку, введите Ctrl+V Tab.

+2

+1 для 'Ctrl + V Tab'. Я этого никогда не знал. :-D – NawaMan

+0

После некоторого поиска в Google я обнаружил, что вы можете также использовать Ctrl + V Ctrl + l для вкладки. (работа над Ubuntu atleast) – NawaMan

+1

@NawaMan, вы уверены, что это не CTRL-v, CTRL-i? CTRL-i - символ табуляции. – paxdiablo

3

Другая альтернатива, используя пробельные классы символов, если ваш выбор СЭД не поддерживает \s:

sed 's/^[[:space:]]*//;s/[[:space:]]*$//'