Очевидно, @TMS не может RTFM.(см. его комментарии к предыдущему ответу)
Если вы хотите сделать это и удалить нужные пробелы:
echo -n "Hello" | od -A n -t x1 | sed 's/ *//g'
Первые две команды в конвейере хорошо объяснены @TMSв своем ответе, под редакцией @James.Последняя команда отличается от комментария @TMS тем, что она верна и проверена.Объяснение:
sed
- это s tream ed itor. s
является s команда ubstitute. /
открывает регулярное выражение - может использоваться любой символ./
является обычным, но неудобным для обработки, скажем, XML или имен путей. /
или выбранный вами альтернативный символ закрывает регулярное выражение и открывает строку подстановки. - В
/ */
*
соответствует любой последовательности предыдущего символа (в данном случае пробел). /
или выбранный вами альтернативный символ закрывает строку подстановки.В этом случае строка подстановки //
пуста, т. Е. Совпадение удалено. g
- это возможность сделать подстановку g в каждой строке, а не один раздля каждой строки. - Кавычки предотвращают запутывание анализатора команд - вся последовательность передается в
sed
в качестве первой опции, а именно, в сценарий sed
.
@ TMS brain child (sed 's/^ *//'
) удаляет только пробелы в начале каждой строки (^
соответствует началу строки - 'pattern space' в sed
-speak).
Если выКроме того, если вы хотите удалить переводы строки, проще всего добавить
| tr -d '\n'
к командным каналам.Он работает следующим образом:
|
подает ранее обработанный поток на стандартный ввод этой команды. tr
- команда аннулирования tr . -d
указывает на удаление символов совпадения. - В кавычках указываются символы совпадения - в данном случае просто символ новой строки (
\n
).Перевести соответствует только одиночным символам, а не последовательностям.
sed
уникально запаздывает при работе с символами новой строки.Это потому, что sed
является одной из самых старых unix
команд - она была создана до того, как люди действительно узнали, что они делают.Распространенное устаревшее программное обеспечение защищает его от исправления.Я знаю это, потому что я родился до того, как родился unix
.
Историческая причина проблемы заключалась в том, что символ новой строки был разделителем строк, а не частью строки.Поэтому он был удален утилитами обработки строк и повторно вставлен утилитами вывода.Проблема в том, что это делает предположения о структуре пользовательских данных и накладывает неестественные ограничения во многих настройках.Неспособность sed
легко удалять переводы строк является одним из наиболее распространенных примеров этой искаженной идеологии, вызывающей горе.
Можно удалять переводы строк с помощью sed
- просто все решения, о которых я знаюЗаставьте sed
обработать весь файл за один раз, что приводит к дросселированию очень больших файлов, побеждая назначение потокового редактора.Любое решение, которое сохраняет обработку строки, если это возможно, было бы нечитаемым крысиным гнездом из нескольких каналов.
Если вы настаиваете на использовании sed
, попробуйте:
sed -z 's/\n//g'
-z
говорит sed
использовать нулевые значения в качестве разделителей строк.
Внутренне строка в C
заканчивается нулем.Опция -z
также является результатом устаревшей версии, предоставленной для удобства C
программистов, которые хотели бы использовать временный файл, заполненный C
-строкой и не загроможденный переводами строк.Затем они могут легко читать и обрабатывать по одной строке за раз.Опять же, ранние предположения о вариантах использования накладывают искусственные ограничения на пользовательские данные.
Если вы опустите опцию g
, эта команда удалит только первый символ новой строки.С опцией -z
sed
интерпретирует весь файл как одну строку (если в файл не вставлены случайные нули), оканчивается нулем, и поэтому это также душит большие файлы.
Вы можете подумать
sed 's/^/\x00/' | sed -z 's/\n//' | sed 's/\x00//'
может сработать. Первая команда ставит нулевое значение в начале каждой строки построчно, в результате \n\x00
заканчивается каждой строкой. Вторая команда удаляет по одной новой строке из каждой строки, теперь разделенной нулями - в силу первой команды будет только одна новая строка. Все, что осталось - это ложные нули. Все идет нормально. Здесь нарушена идея, что канал будет передавать последнюю команду построчно, поскольку именно так был построен поток. На самом деле, последняя команда, как написано, удалит только один ноль, так как теперь весь файл не имеет новых строк и поэтому является одной строкой.
Простая конвейерная реализация использует промежуточный временный файл, и все входные данные обрабатываются и передаются в файл. Следующая команда может выполняться в другом потоке, одновременно читая этот файл, но она просто видит поток целиком (хотя и неполный) и не знает о границах чанка, питающих файл. Даже если канал является буфером памяти, следующая команда видит поток целиком. Дефект неразрывно запекается в sed
.
Чтобы этот подход работал, вам нужно указать опцию g
в последней команде, так что, опять же, она захлебывается большими файлами.
Суть в следующем: не используйте sed
для обработки перевода строки.