Используйте sed для удаления всех начальных/последующих пробелов в текстовом файле

Файл1:

  hello  
  world  

Как можно удалить начальные/конечные пробелы в этом файле с помощью sed - используя одну команду (без промежуточных файлов)?

В настоящее время у меня есть:

sed -e 's/^[ \t]*//' a > b

Для ведущих пробелов.

sed 's/ *$//' b > c

И это для конечных пробелов.


person user191960    schedule 20.10.2009    source источник
comment
В то время как ответ @ghostdog74 хороший, ответ @mouviciel является правильным, согласно вашему вопросу. Я проголосовал за оба, но я считаю, что @mouviciel заслуживает того, чтобы его приняли как правильный ответ.   -  person Hosam Aly    schedule 20.10.2009
comment
Вы правы - mouviciel теперь принят. Спасибо mouviciel (правильный ответ) и ghostdog74 (направление на awk) за их время!   -  person user191960    schedule 20.10.2009


Ответы (4)


Вы почти поняли:

sed -e 's/^[ \t]*//;s/[ \t]*$//' a > c

Более того, в некоторых разновидностях sed также есть возможность встроенного редактирования:

sed -i -e 's/^[ \t]*//;s/[ \t]*$//' a
person mouviciel    schedule 20.10.2009
comment
Я бы также подумал о сопоставлении \s, которое является общим «все символы пробела». - person Matthew Scharley; 20.10.2009
comment
Разве это не должно быть sed -e 's/^[ \t]*//;s/[ \t]*$//' a > c? - person Nikos Alexandris; 27.03.2015
comment
Я все еще вижу sed -e 's/^[ \t]*//;s/[ \t]*$/' a > c, который у меня не работает (версия bash 4.3.30, Funtoo-Linux). - person Nikos Alexandris; 28.03.2015
comment
@NikosAlexandris - Спасибо, теперь я вижу недостающую косую черту. Исправлена. - person mouviciel; 29.03.2015

более простой способ, используя awk

awk '{$1=$1}1' file

or

awk '{gsub(/^ +|  +$/,"")}1' file
person ghostdog74    schedule 20.10.2009
comment
Первый работал отлично и был самым упрощенным - я знаю, что это не то, что я просил (т.е. sed), но он такой элегантный :). Сейчас поищу awk. - person user191960; 20.10.2009
comment
Первый удаляет все ложные пробелы, а не только начальные и конечные. Лучше всего работает второй. awk — отличный инструмент. - person mouviciel; 20.10.2009
comment
Ах, я вижу, что другие пробелы удалены с первым - второй работает без лишних удалений. - person user191960; 20.10.2009

perl -lape 's/^\s+|\s+$//g'

Честно говоря, я знаю, что регулярные выражения Perl лучше всего, поэтому я нахожу perl -lape намного проще в использовании, чем sed -e.

Кроме того, чтобы ответить на исходный вопрос, вы можете выполнить несколько операций, например:

sed -e 's/something/something else/' -e 's/another substitution/another replacement/'

По-видимому, вы также можете поместить две замены в одну строку и разделить их точкой с запятой, как указано в другом ответе.

person Ryan C. Thompson    schedule 27.10.2009

Обратите внимание, что в более общем случае применения нескольких фильтров подряд к входному файлу без использования промежуточных файлов решение состоит в использовании конвейеров:

sed -e 's/^[ \t]*//' a | sed -e 's/ *$//' > c

Очевидно, что здесь они не требуются, потому что достаточно одного вызова sed, но если вторая команда sed была чем-то другим, например, uniq или sort, то этот шаблон является правильным.

person Ryan C. Thompson    schedule 22.02.2013