Я хотел бы удалить все начальные и конечные пробелы и вкладки из каждой строки в выводе.
Есть ли простой инструмент, как trim
я мог бы передать свой вывод?
Пример файла:
test space at back
test space at front
TAB at end
TAB at front
sequence of some space in the middle
some empty lines with differing TABS and spaces:
test space at both ends
Ответы:
или короче:
Обрезает начальные и конечные пробелы или символы табуляции 1, а также сжимает последовательности табуляций и пробелов в один пробел.
Это работает, потому что когда вы назначаете что-то одному из полей ,
awk
перестраивает всю запись (как напечатаноprint
), объединяя все поля ($1
, ...,$NF
) сOFS
(пробел по умолчанию).1 (и, возможно, другие пустые символы в зависимости от локали и
awk
реализации)источник
awk '{$1=$1}1'
;
требуется в стандартном синтаксисе awkecho -e 'foo \t bar' | awk '{$1=$1};1'
echo ' hello ' | xargs
Команду можно сжать примерно так, если вы используете GNU
sed
:пример
Вот приведенная выше команда в действии.
Вы можете использовать,
hexdump
чтобы подтвердить, чтоsed
команда удаляет нужные символы правильно.Классы персонажей
Вы также можете использовать имена классов символов вместо буквального перечисления наборов, таких как
[ \t]
:пример
Большинство инструментов GNU, использующих регулярные выражения (регулярные выражения), поддерживают эти классы.
Использование их вместо литеральных наборов всегда кажется пустой тратой пространства, но если вы обеспокоены тем, что ваш код переносим, или вам приходится иметь дело с альтернативными наборами символов (например, международными), то вы, вероятно, захотите использовать имена классов вместо.
Рекомендации
источник
[[:space:]]
это не эквивалентно[ \t]
в общем случае (Unicode и т. Д.).[[:space:]]
вероятно, будет намного медленнее (поскольку в юникоде гораздо больше типов пробелов, чем просто' '
и'\t'
). То же самое для всех остальных.sed 's/^[ \t]*//'
не является портативным На самом деле POSIX даже требует, чтобы это убирало последовательность пробелов, обратной косой черты илиt
символов, и это то же самое делает GNUsed
, когдаPOSIXLY_CORRECT
находится в среде.sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//'
Как предложил Стефан Шазелас в принятом ответе, теперь вы можете
создать скрипт
/usr/local/bin/trim
:и дать этому файлу права на выполнение:
Теперь вы можете передать каждый вывод,
trim
например:(для комментариев ниже: я использовал это раньше:
while read i; do echo "$i"; done
который также работает нормально, но менее производительно)
источник
while read -r line
чтобы сохранить обратную косую черту и даже тогда ... . Что касается огромных файлов / скорости, действительно, вы выбрали худшее решение. Я не думаю, что там что-то хуже. См. Ответы на вопрос: почему использование цикла оболочки для обработки текста является плохой практикой? включая мой комментарий к последнему ответу, где я добавил ссылку на тест скорости. Этиsed
ответы здесь прекрасно IMO и гораздо лучше , чемread
.-
и после которых следуют комбинации из 1 или более символов e, E или n, и / или содержит символы NUL. Кроме того, не завершенная строка после последней новой строки будет пропущена.XARGS без аргументов делают это.
Пример:
источник
xargs
получится, если входные данные содержат обратную косую черту и одинарные кавычки.echo
вызовов. Некоторые реализации echo также будут обрабатывать опции и / или обратную косую черту ... Это также работает только для однострочного ввода.Если вы читаете строку в переменную оболочки,
read
делайте это уже, если не указано иное .источник
read
. Так что, если вы читаете в то время как читать это работает:cat file | while read i; do echo $i; done
echo "$i"
чтобы увидеть истинный эффект отread
Если вы храните строки как переменные, вы можете использовать bash для выполнения работы:
удалить начальные пробелы из строки:
удалить конечные пробелы из строки:
удалить все пробелы из строки:
источник
Чтобы удалить все начальные и конечные пробелы из заданной строки благодаря инструменту «piped», я могу выделить 3 различных способа, которые не полностью эквивалентны. Эти различия касаются пробелов между словами строки ввода. В зависимости от ожидаемого поведения, вы сделаете свой выбор.
Примеры
Чтобы объяснить различия, давайте рассмотрим эту фиктивную строку ввода:
тр
tr
действительно простая команда. В этом случае он удаляет любой пробел или символ табуляции.AWK
awk
удаляет начальные и хвостовые пробелы и сжимает в один пробел каждый пробел между словами.СЕПГ
В этом случае
sed
удаляет начальные и хвостовые пробелы, не касаясь пробелов между словами.Примечание:
В случае одного слова в строке,
tr
делает работу.источник
[:space:]
вместо [: blank:] командуtr
, например:,... | tr -d [:space:]
для удаления новых строк. (смman tr
)sed - отличный инструмент для этого:
Вы можете использовать его в вашем случае, будь то в тексте, например,
или действуя по нему «встроенно», если вы
sed
используете GNU:но изменение источника таким способом «опасно», так как может быть невосстановимым, когда он не работает должным образом (или даже когда это работает!), поэтому сначала создайте резервную копию (или используйте,
-i.bak
что также имеет преимущество, которое переносимо на некоторые BSDsed
) !источник
команда перевода будет работать
источник
Если строка, которую вы пытаетесь обрезать, является короткой и непрерывной / непрерывной, можно просто передать ее в качестве параметра любой функции bash:
источник