- Как я могу удалить завершающий перевод строки в bash?
- удаление замыкающего пустые линии-SED
- Аннотация
- Другие решения
- переменная
- Память
- Две строки в памяти
- Прямая обработка
- Linux убрать переносы строк
- Команда tr и ее синтаксис
- 1) Заменить все строчные буквы на заглавные
- 2) Удаление символов с помощью tr
- 3) Удаление ила змена символов НЕ в наборе
- 4) Замена пробелов на табуляцию
- 5) Удаление повторений символов
- 6) Заменить символы из набора на перенос строки
- 7) Генерируем список уникальных слов из файла
- 8) Кодируем символы с помошью ROT
- Вывод
- unixforum.org
- Решено: удалить в тексте переносы строк
- Решено: удалить в тексте переносы строк
- Re: Решено: удалить в тексте переносы строк
- Re: Решено: удалить в тексте переносы строк
- Re: Решено: удалить в тексте переносы строк
- Как отключить перенос строки в терминале?
Как я могу удалить завершающий перевод строки в bash?
Я ищу что-то похожее на Perl chomp . Я ищу команду, которая просто печатает ввод, минус последний символ, если это новая строка:
(Подстановка команд в Bash и Zsh удаляет все завершающие новые строки, но я ищу что-то, что максимально удаляет одну завершающую новую строку.)
Это должно работать:
Скрипт всегда печатает предыдущую строку вместо текущей, а последняя строка обрабатывается по-разному.
Что это делает более подробно:
- NR>1
Распечатать предыдущую строку (кроме первого раза). Сохраняет текущую строку в PREV переменной. - END
Наконец, напечатайте последнюю строку без перевода строки.
Также обратите внимание, что это приведет к удалению не более одной пустой строки в конце (без поддержки удаления «one\ntwo\n\n\n» ).
Вы можете использовать perl без chomp :
Но почему бы не использовать chomp себя:
Если вам нужен точный эквивалент chomp , первым методом, который мне приходит в голову, является решение awk, которое уже выложил LatinSuD . Я добавлю некоторые другие методы, которые не реализуют, chomp но реализуют некоторые общие задачи, которые chomp часто используются для.
Когда вы помещаете некоторый текст в переменную, все символы новой строки в конце удаляются. Таким образом, все эти команды выдают одинаковый однострочный вывод:
Если вы хотите добавить какой-либо текст в последнюю строку файла или вывода команды, это sed может быть удобно. С GNU sed и большинством других современных реализаций это работает, даже если ввод не заканчивается новой строкой¹; однако, это не добавит новую строку, если ее еще не было.
¹ Однако это не работает со всеми реализациями sed: sed — это инструмент обработки текста, а файл, который не пуст и не заканчивается символом перевода строки, не является текстовым файлом.
Другой perl подход. Он считывает весь ввод в память, поэтому он не может быть хорошей идеей для больших объемов данных (используйте cuonglm или awk подход для этого):
Я поймал это где-то в репозитории github, но не могу найти где
удаление замыкающего пустые линии-SED
Аннотация
Печатайте строки без новой строки, добавляйте новую строку, только если есть еще одна строка для печати.
Другие решения
Если мы работали с файлом, мы можем просто обрезать один символ из него (если он заканчивается на новой строке):
Это быстрое решение, так как нужно прочитать только один символ из файла, а затем удалить его напрямую ( truncate ), не читая весь файл.
Однако при работе с данными из stdin (потока) все данные должны быть прочитаны. И это «потребляется», как только это прочитано. Нет возврата (как с усечением). Чтобы найти конец потока, нам нужно прочитать его до конца. В этот момент нет возможности вернуться назад к входному потоку, данные уже «использованы». Это означает, что данные должны храниться в некотором виде буфера до тех пор, пока мы не совпадем с концом потока, а затем что-то сделаем с данными в буфере.
Наиболее очевидным из решений является преобразование потока в файл и обработка этого файла. Но вопрос требует какого-то фильтра потока. Не об использовании дополнительных файлов.
переменная
Наивным решением было бы захватить весь ввод в переменную:
Память
Можно загрузить весь файл в память с помощью sed. В sed невозможно избежать завершающего перевода строки на последней строке. GNU sed может не печатать завершающий символ новой строки, но только если в исходном файле его уже нет. Так что нет, простой sed не может помочь.
За исключением GNU awk с -z опцией:
С помощью awk (любой awk) хлебать весь поток, и printf это без завершающего перевода строки.
Загрузка всего файла в память может быть не очень хорошей идеей, поскольку она может занимать много памяти.
Две строки в памяти
В awk мы можем обработать две строки в цикле, сохранив предыдущую строку в переменной и напечатав текущую:
Прямая обработка
Но мы могли бы сделать лучше.
Если мы печатаем текущую строку без новой строки и печатаем новую только тогда, когда существует следующая строка, мы обрабатываем по одной строке за раз, и последняя строка не будет иметь завершающий символ новой строки:
Источник
Linux убрать переносы строк
Команда tr (translate) используется в Linux в основном для преобразования и удаления символов. Она часто находит применение в скриптах обработки текста. Ее можно использовать для преобразования верхнего регистра в нижний, сжатия повторяющихся символов и удаления символов.
Команда tr требует два набора символов для преобразований, а также может использоваться с другими командами, использующими каналы (пайпы) Unix для расширенных преобразований.
В этой статье мы узнаем, как использовать команду tr в операционных системах Linux и рассмотрим некоторые примеры.
Команда tr и ее синтаксис
Ниже приведен синтаксис команды tr. Требуется, как минимум, два набора символов и опции.
SET1 и SET2 это группы символов. are a group of characters. Необходимо перечислить необходимые символы или указать последовательность.
\NNN -> восмеричные (OCT) символы NNN (1 до 3 цифр)
\\ -> обратный слеш (экранированный)
\n -> новая строка (new line)
\r -> перенос строки (return)
\t -> табуляция (horizontal tab)
[:alnum:] -> все буквы и цифры
[:alpha:] -> все буквы
[:blank:] -> все пробелы
[:cntrl:] -> все управляющие символы (control)
[:digit:] -> все цифры
[:lower:] -> все буквы в нижнем регистре (строчные)
[:upper:] -> все буквы в верхнем регистре (заглавные)
Примеры использования команды tr:
Вот некоторые опции:
-c , -C , —complement -> удалить все символы, кроме тех, что в первом наборе
-d , —delete -> удалить символы из первого набора
-s , —squeeze-repeats -> заменять набор символов, которые повторяются, из указанных в последнем наборе знаков
1) Заменить все строчные буквы на заглавные
Мы можем использовать tr для преобразования нижнего регистра в верхний или наоборот.
Просто используем наборы [:lower:] [:upper:] или «a-z» «A-Z» для замены всех символов.
Вот пример, как преобразовать в Linux с помощью команды tr все строчные буквы в заглавные:
А сейчас сделаем замену из файла input.txt
Как мы видим, в файле ничего не изменилось, осталось все строчными буквами. Чтобы изменения были в файле, на необходимо перевести вывод в новый файл. Например, в output.txt
Кстати, в команде sed есть опция y которая делает то же самое (sed ‘y/SET1/SET2’)
2) Удаление символов с помощью tr
Опция -d используется для удаления всех символов, которые указаны в наборе символов.
Следующая команда удалит все символы из этого набора ‘aei’.
Следующая команда удалит все цифры в тексте. Будем использовать набор [:digit:] , чтобы определить все цифры.
А вот пример команд, которыми можно удалить переносы на новые строки
3) Удаление ила змена символов НЕ в наборе
С помощью параметра -c Вы можете сказать tr заменить все символы, которые Вы не указали в наборе. Приведем пример.
А вот пример удаления, просто укажем опцию -d и только один набор (символы которого удалять НЕ надо, а остальные удалить)
4) Замена пробелов на табуляцию
Для указания пробелов используем — [:space:] , а для табуляции — \t.
5) Удаление повторений символов
Это делает параметр -s . Рассмотрим пример удаления повторов знаков.
Или заменим повторения на символ решетки
6) Заменить символы из набора на перенос строки
Сделаем так, чтобы все буквы были заменены на перенос новой строки:
7) Генерируем список уникальных слов из файла
Это иногда очень полезная команда, когда необходимо определить количество повторений и вывести уникальные слова из файла:
8) Кодируем символы с помошью ROT
ROT (Caesar Cipher) — это тип криптографии, в котором кодирование выполняется путем перемещения букв в алфавите к его следующей букве.
Давайте проверим, как использовать tr для шифрования.
В следующем примере каждый символ в первом наборе будет заменен соответствующим символом во втором наборе.
Первый набор [a-z] (это значит abcdefghijklmnopqrstuvwxyz). Второй набор [n-za-m] (который содержит pqrstuvwxyzabcdefghijklmn).
Простая команда для демонстрации вышеуказанной теории:
Полезно при шифровании электронных адресов:
Вывод
tr — это очень мощная команда линукс при использовании пайпов Unix и очень часто используется в скриптах. Дополнительную информацию об этой утилите всегда можно найти в man.
Если у Вас есть какие-либо дополнения, не стесняйтесь пишите в комментариях.
Источник
unixforum.org
Форум для пользователей UNIX-подобных систем
- Темы без ответов
- Активные темы
- Поиск
- Статус форума
Решено: удалить в тексте переносы строк
Модератор: Bizdelnick
Решено: удалить в тексте переносы строк
Сообщение xa3ap » 24.05.2009 15:31
имеется plain text, каким то мудаком разбитый переносами по 80 символов. как удалить эти переносы. но оставить пробелы перед абзацами?
Re: Решено: удалить в тексте переносы строк
Сообщение Nikky » 24.05.2009 15:35
Re: Решено: удалить в тексте переносы строк
Сообщение allez » 24.05.2009 15:57
cat plain.txt | tr «\n» » » > new.txt
tr «\n» » » new.txt
P. S. И не следует называть чудаками на букву «м» незнакомых (и, скорее всего, ничем вам не обязанных) людей только потому, что вам не понравилось форматирование текстового файла. 😉
Re: Решено: удалить в тексте переносы строк
Сообщение xa3ap » 24.05.2009 16:57
cat plain.txt | tr «\n» » » > new.txt
tr «\n» » » new.txt
P. S. И не следует называть чудаками на букву «м» незнакомых (и, скорее всего, ничем вам не обязанных) людей только потому, что вам не понравилось форматирование текстового файла.
мне надо ещё учитывать новые абзаци (они выглядят как «\n » — новая строка и пробелы в начале строки). по идее должно работать:
cat plain.txt | tr «\n » «***» > new.txt
cat new.txt | tr «\n» » » > tmp.txt
cat tmp.txt | tr «***» «\n» > new.txt
но вместо нормального результата выходит ч.з.ч. кажется, дело в том, что текст ‘выровнен’ — сплошь и рядом встречаются два и больше пробелов вместе.
обьясните, пожалуйста, в чем тут дело? таки напишите скрипт Работающий.
Источник
Как отключить перенос строки в терминале?
Мне нужно просматривать большие файлы журналов с помощью оболочки Bash. Я использовал less для открытия файлов, но так как строки слишком длинные, происходит какая-то перенос строки / слова.
Поскольку файлы представляют собой журналы Log4J, и в начале каждой строки есть шаблон, обернутые строки затрудняют анализ выходных данных, поэтому я начал использовать метод, less -S который прерывает длинные строки.
Но теперь мне нужно использовать tail -f , и это также строка переносит вывод. Можно ли отключить перенос строки в оболочке bash для всех команд?
Примечание: есть ответ на другой вопрос, в котором упоминается escape-последовательность echo -ne ‘\e[?7l’ , но он не работает на bash.
Вы действительно нуждаетесь tail -f или хотели бы что-то less +F сделать Поскольку кажется, что вы все еще хотите интерактивный пейджер, мне кажется, что было бы намного легче придерживаться его, less чем переопределять его самостоятельно.
Последнее замечание: вы рассматривали tail -f file | less ?
less -S +F filename
- Нажмите, Ctrl c чтобы остановить хвост, и теперь вы можете перемещаться влево и вправо с помощью клавиш курсора.
- Нажмите, Shift f чтобы возобновить хвостохранилище
- Нажмите Ctrl c , q чтобы выйти
Нашел хороший ответ от суперпользователя , который работает из коробки gnome-terminal и, вероятно, для других терминалов:
Предположим, вы определили COLUMNS переменную, вы можете выполнить
в противном случае $COLUMNS подставьте ширину столбцов терминала, полученную с помощью stty -a .
Вы можете отключить перенос строк для less , tail и любой другой команды под солнцем Linux с:
Чтобы восстановить перенос строки, используйте:
Эмулятор терминала терминатора (http://software.jessies.org/terminator/) позволяет не переносить длинные строки и имеет горизонтальную прокрутку (но написана на Java).
Два хороших ответа / примеры здесь
Одно предостережение: по крайней мере, на встроенном терминале на моем Mac Cut, кажется, не очень хорошо обрабатывает символы табуляции. Кажется, он отображает их, например, с 8 пробелами, но просто вычисляет их как 4 пробела в ширину или что-то в этом роде. Другими словами, если ваш терминал имеет ширину 80 символов и ваш вывод содержит несколько вкладок на строку, вы должны установить ширину, может быть, 60 или что-то подобное. YMMV.
Используйте ниже варианты с less . Это отключит перенос слов и сохранит цвета текста, если указано.
less -SR +F filename
На этой странице приведено несколько примеров с использованием -f . из моих тестов это не работает должным образом, если вам действительно нужен конвейер (например, если вам нужно передать что-то большее, например, grep), вы можете использовать что-то вроде :
возможно, не самый лучший по производительности, но работает . иначе, если не требуется дополнительная передача, вы можете использовать что-то другое, например:
Есть много комментариев, которые отклоняются от вопроса. Вопрос ОП был
Но теперь мне нужно использовать tail -f , и это также строка переносит вывод. Можно ли отключить перенос строки в оболочке bash для всех команд?
Некоторые комментарии были сделаны по поводу функции автоматического переноса, заявив, что она есть не во всех терминалах. Может быть. Но (кроме терминатора , разработчики которого не описывают описание терминала ), все приведенные примеры были xterm, rxvt, а также похожими или потомками. Все это связано.
+aw Вариант в xterm соответствует autoWrap ресурсу. Обращаясь к руководству, он говорит, что
что, безусловно, не «зависит от вашего выбора терминала», поскольку любой терминал с VT100-совместимостью поддерживает эту функцию. xterm и rxvt делают это, например. Другие делают так же.
Вопрос о том, будет ли эта функция полезна для OP, спорен. Подавление переноса строк — это только один аспект проблемы:
- Оболочка знает ширину терминала, но это можно переопределить, установив COLUMNS «большое» значение.
- Конечно, это означает, что приложения будут тратить много времени на написание правого поля (а некоторые, если его неправильно, все равно начнут новую строку).
- OP, вероятно, предполагал, что приложение будет прокручивать влево / вправо, чтобы использовать широкий терминал. (терминатор делает это — частично — но другие его недостатки отменяют это, за исключением тех, кто использует терминал только для вывода cat файла журнала на экран).
- На самом деле OP ищет набор инструментов, которые могут отключить перенос строк, особенно для просмотра файлов журналов. Если терминал работает достаточно хорошо для общего использования, это не имеет отношения к выбору инструментов, которые используются в терминале.
Есть пейджеры, которые могут делать то, что нужно, например, многозадачный, который перечисляет в своих функциях
Перенос строки можно отключить, после чего можно перемещаться влево / вправо с помощью клавиш курсора.
Будучи основанным на ncurses, он должен работать на любом из указанных терминалов.
Источник