Linux заменить перенос строки на пробел

Обновлено: 08.07.2024

Работа со строками в bash осуществляется при помощи встроенных в оболочку команд.

Термины

  • Консольные окружения — интерфейсы, в которых работа выполняется в текстовом режиме.
  • Интерфейс — механизм взаимодействия пользователя с аппаратной частью компьютера.
  • Оператор — элемент, задающий законченное действие над каким-либо объектом операционной системы (файлом, папкой, текстовой строкой и т. д.).
  • Текстовые массивы данных — совокупность строк, записанных в переменную или файл.
  • Переменная — поименованная область памяти, позволяющая осуществлять запись и чтение данных, которые в нее записываются. Она может принимать любые значения: числовые, строковые и т. д.
  • Потоковый текстовый редактор — программа, поддерживающая потоковую обработку текстовой информации в консольном режиме.
  • Регулярные выражения — формальный язык поиска части кода или фрагмента текста (в том числе строки) для дальнейших манипуляций над найденными объектами.
  • Bash-скрипты — файл с набором инструкций для выполнения каких-либо манипуляций над строкой, текстом или другими объектами операционной системы.

Сравнение строковых переменных

Для выполнения операций сопоставления 2 строк (str1 и str2) в ОС на основе UNIX применяются операторы сравнения.

Основные операторы сравнения

  1. Равенство « = »: оператор возвращает значение «истина» («TRUE»), если количество символов в строке соответствует количеству во второй.
  2. Сравнение строк на эквивалентность « == »: возвращается «TRUE», если первая строка эквивалентна второй ( дом == дом ).
  3. Неравенство «str1 != str2»: «TRUE», если одна строковая переменная не равна другой по количеству символов.
  4. Неэквивалентность «str1 !== str2»: «TRUE», если одна строковая переменная не равна другой по смысловому значению ( дерево !== огонь ).
  5. Первая строка больше второй «str1 > str2»: «TRUE», когда str1 больше str2 по алфавитному порядку. Например, « дерево > огонь » , поскольку литера «д» находится ближе к алфавитному ряду, чем «о».
  6. Первая строка меньше второй «str1 < str2»: «TRUE», когда str1 меньше str2 по алфавитному порядку. Например, « огонь < дерево », поскольку «о» находится дальше к началу алфавитного ряда, чем «д».
  7. Длина строки равна 0 « -z str2»: при выполнении этого условия возвращается «TRUE».
  8. Длина строки отлична от нулевого значения « -n str2»: «TRUE», если условие выполняется.

Пример скрипта для сравнения двух строковых переменных

Строки в bash - скрипт

Создание тестового файла

Обработка строк не является единственной особенностью консольных окружений Ubuntu. В них можно обрабатывать текстовые массивы данных.

  1. Для практического изучения команд, с помощью которых выполняется работа с текстом в интерпретаторе bash, необходимо создать текстовый файл txt .
  2. После этого нужно наполнить его произвольным текстом, разделив его на строки. Новая строка не должна сливаться с другими элементами.
  3. Далее нужно перейти в директорию, в которой находится файл, и запустить терминал с помощью сочетания клавиш — Ctrl+Alt+T.

Основы работы с grep

Поиск строки в файле операционной системы Linux Ubuntu осуществляется посредством специальной утилиты — grep . Она позволяет также отфильтровать вывод информации в консоли. Например, вывести все ошибки из log-файла утилиты ps или найти PID определенного процесса в ее отчете.

Команда grep работает с шаблонами и регулярными выражениями. Кроме того, она применяется с другими командами интерпретатора bash.

Синтаксис команды

Для работы с утилитой grep необходимо придерживаться определенного синтаксиса

  1. grep [options] pattern [file_name1 file_name2 file_nameN] (где «options» — дополнительные параметры для указания настроек поиска и вывода результата; «pattern» — шаблон, представляющий строку поиска или регулярное выражение, по которым будет осуществляться поиск; «file_name1 file_name2 file_nameN» — имя одного или нескольких файлов, в которых производится поиск).
  2. instruction | grep [options] pattern (где «instruction» — команда интерпретатора bash, «options» — дополнительные параметры для указания настроек поиска и вывода результата, «pattern» — шаблон, представляющий строку поиска или регулярное выражение, по которым будет производиться поиск).

Строки в bash - синтаксис

Основные опции

Практическое применение grep

Поиск подстроки в строке

Строки в bash - grep

В окне терминала выводятся все строки, содержащие подстроку. Найденные совпадения подсвечиваются другим цветом.

  • С учетом регистра:
  • Без учета регистра:

Вывод нескольких строк

  • Строка с вхождением и две после нее:
  • Строка с вхождением и три до нее:
  • Строка, содержащая вхождение, и одну до и после нее:

Чтение строки из файла с использованием регулярных выражений

Регулярные выражения расширяют возможности поиска и позволяют выполнить разбор строки на отдельные элементы. Они активируются при помощи ключа -e.

Чтобы вывести первый символ строки, нужно воспользоваться конструкцией

Если воспользоваться числовыми интервалами, то можно вывести все строки, в которых встречаются числа:

Рекурсивный режим поиска

  • Чтобы найти строку или слово в нескольких файлах, расположенных в одной папке, нужно использовать рекурсивный режим поиска:
  • Если нет необходимости выводить имена файлов, содержащих искомую строку, то можно воспользоваться ключом-параметром деактивации отображения имен:

Точное вхождение

При поиске союза «и» grep будет выводить все строки, в которых он содержится. Чтобы этого избежать, требуется использовать специальный ключ « w »:

Поиск нескольких слов

Утилита «w» позволяет искать не только одно слово, но и несколько одновременно

Количество строк в файле

При помощи grep можно определить число вхождений строки или подстроки в текстовом файле и вывести ее номер.

Строки в bash - grep

  • Число вхождений:
  • Номера строк с совпадениями:

Инверсия

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

Вывод только имени файла

Чтобы не выводить все строки с совпадением, а вывести только имя файла, нужно воспользоваться конструкцией:

Использование sed

Потоковый текстовый редактор « sed » встроен в bash Linux Ubuntu. Он использует построчное чтение, а также позволяет выполнить фильтрацию и преобразование текста.

Синтаксис

Для работы с потоковым текстовым редактором sed используется следующий синтаксис:

sed [options] instructions [file_name] (где «options» — ключи-опции для указания метода обработки текста, «instructions» — команда, совершаемая над найденным фрагментом текста, «file_name» — имя файла, над которым совершаются действия).

Строки в bash - sed help

Для вывода всех опций потокового текстового редактора нужно воспользоваться командой:

Распространенные конструкции с sed

Замена слова

Например, если требуется заменить строку в файле или слово с «команды» на «инструкции». Для этого нужно воспользоваться следующими конструкциями:

Редактирование файла

Чтобы записать строку в файл, нужно указать параметр замены одной строки на другую, воспользовавшись ключом — -i :

После выполнения команды произойдет замена слова «команды» на «инструкции» с последующим сохранением файла.

Удаление строк из файла

  • Удалить первую строку из файла:
  • Удалить строку из файла, содержащую слово«окне»:

Нумерация строк

Строки в файле будут пронумерованы следующим образом: первая строка — 1, вторая — 2 и т. д.

Строки в bash - нумерация строк

Следует обратить внимание, что нумерация начинается не с «0», как в языках программирования.

Удаление всех чисел из текста

Замена символов

Чтобы заменить набор символов, нужно воспользоваться инструкцией, содержащей команду « y »:

Обработка указанной строки

Утилита производит манипуляции не только с текстом, но и со строкой, указанной в правиле шаблона (3 строка):

Работа с диапазоном строк

Для выполнения замены только в 3 и 4 строках нужно использовать конструкцию:

Как я могу заменить пробелы на новые строки на входе, как:

/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5 и т.д.

Чтобы получить следующее:

Запись

Я отправляю этот вопрос, чтобы помочь другим пользователям, было нелегко найти полезный ответ в UNIX SE, пока я не начал набирать этот вопрос. После этого я обнаружил следующее:

Связанный вопрос

Используйте tr команду

tr был моей первой мыслью, хотя есть так много способов сделать это! Это в значительной степени именно то, что tr для, хотя! +1, но в качестве комментария: это не работает, если имена файлов содержат сами пробелы

В этом случае я бы использовал printf:

Если в одном из путей есть пробелы , вы можете заключить в кавычки этот путь к файлу, чтобы предотвратить его разбиение на пробелы:

Для преобразования текста в целом, tr ваша лучшая ставка, как описано в существующем ответе.

Небольшая заметка из будущего: спасибо за публикацию этого решения, оно было очень надежным для меня, по сравнению с использованием "echo".

Предполагая, что у вас есть строка с пробелами в качестве разделителей:

Однако вы, вероятно, задаете не тот вопрос. (Не обязательно, например, это может появиться в make-файле.) Разделенный пробелами список имен файлов на самом деле не работает: что если одно из имен файлов содержит пробелы?

Если программа получает имена файлов в качестве аргументов, не объединяйте их с пробелами. Используйте "$@" для доступа к ним один за другим. Хотя echo "$@" печатает аргументы с пробелами между ними, это происходит из-за echo : он печатает свои аргументы с пробелами в качестве разделителей. somecommand "$@" передает имена файлов как отдельные аргументы в команду. Если вы хотите напечатать аргументы в отдельных строках, вы можете использовать

Если у вас есть имена файлов, разделенных пробелами, и вы хотите поместить их в массив для работы с ними, вы можете использовать расширение переменной без кавычек, чтобы разделить значение на символы IFS (вам нужно отключить расширение с помощью символа подстановки set -f , в противном случае glob шаблоны будут расширены по значению):

Вы можете заключить это в функцию, которая восстанавливает -f настройку и значение, IFS когда это будет сделано:

Мне нужно просматривать большие файлы журналов с помощью оболочки Bash. Я использовал less для открытия файлов, но так как строки слишком длинные, происходит какая-то перенос строки / слова.

Поскольку файлы представляют собой журналы Log4J, и в начале каждой строки есть шаблон, обернутые строки затрудняют анализ выходных данных, поэтому я начал использовать метод, less -S который прерывает длинные строки.

Но теперь мне нужно использовать tail -f , и это также строка переносит вывод. Можно ли отключить перенос строки в оболочке bash для всех команд?

Примечание: есть ответ на другой вопрос, в котором упоминается escape-последовательность echo -ne '\e[?7l' , но он не работает на bash.

Обратите внимание, что это не связано с вашим выбором оболочки (bash), но может зависеть от вашего выбора терминала (xterm, Terminal, gnome-terminal, konsole,…). Смотрите Какова точная разница между терминалом, оболочкой, tty и консолью? Как упоминал Жиль, это вопрос эмулятора терминала. Например, в screen , есть команда "обернуть". В xterm , есть -aw опция для предотвращения автоматического переноса строк. Вероятно, есть некоторые X-ресурсы для других эмуляторов терминала. Какой эмулятор вы используете? @Arcege: На самом деле, это +aw для xterm :) Но это решает проблему для вывода (например, ls -l при использовании набора длинных имен Windows из TPB, это работает нормально), для ввода при вводе команды вы, вероятно, все еще хотите обернуть (или, по крайней мере, вы не хотите, чтобы он был таким, какой он есть сейчас +aw : попробуйте написать за «границей столбца», а затем откатитесь назад для огромной ошибки GFX). Кстати, похоже, ни отключить перенос строк, urxvt ни rxvt

Вы действительно нуждаетесь tail -f или хотели бы что-то less +F сделать Поскольку кажется, что вы все еще хотите интерактивный пейджер, мне кажется, что было бы намного легче придерживаться его, less чем переопределять его самостоятельно.

Последнее замечание: вы рассматривали tail -f file | less ?

Я получил некоторый опыт работы с этими эмуляторами, screen и у xterm них есть возможность предотвратить перенос строк. Но есть большая разница между усечением линии и скрытием ее конца, поэтому мы можем просмотреть ее, если захотим. Использование tail -f file | less -S не является идеальным, так как кажется, что отключить, -f но это лучшее решение, которое я нашел. @ Борис Маркос ответ, возможно, лучше. Он использует less напрямую.

less -S +F filename

  • Нажмите, Ctrl c чтобы остановить хвост, и теперь вы можете перемещаться влево и вправо с помощью клавиш курсора.
  • Нажмите, Shift f чтобы возобновить хвостохранилище
  • Нажмите Ctrl c , q чтобы выйти
Это здорово! У моего терминала два экрана, но так как я прочитал это вчера, я просто передал широкий вывод less -S . Также очень полезно на ноутбуке.

Нашел хороший ответ от суперпользователя , который работает из коробки gnome-terminal и, вероятно, для других терминалов:

введите описание изображения здесь

Предположим, вы определили COLUMNS переменную, вы можете выполнить

в противном случае $COLUMNS подставьте ширину столбцов терминала, полученную с помощью stty -a .

Другой альтернативой $COLUMNS (не обновляется сразу SIGWINCH , только в следующем приглашении) и stty -a (сложнее использовать в скрипте) является tput cols . Спасибо энзотиб. Это работает, но это урезает линию, и мы не можем видеть конец длинных линий. Можно ли заставить cut себя вести себя так, как будто less -S длинная строка буферизована, и мы можем увидеть всю строку, используя клавиши со стрелками? Хм, не все так просто. Я думаю о проводных решениях, как, например, о двух отдельных screen окнах, каждое из которых tail -f | cut имеет сценарий или эмулирует less поведение. Но пока нет решения, на данный момент. Примечание: вырезать только байты; в отличие от этого less -S , он собирается испортить цветной текст или что-нибудь с выходом ANSI. Может тоже испортить Unicode. Да, less -S более полезно с цветным текстом. Вы можете использовать less -S -E для немедленного выхода - полезно для резки цветного вывода в $ COLUMNS.

Вы можете отключить перенос строк для less , tail и любой другой команды под солнцем Linux с:

Чтобы восстановить перенос строки, используйте:

Как мне это включить? Кажется, он не работает по умолчанию. На момент написания статьи горизонтальная прокрутка включена по умолчанию. Отличная кроссплатформенная рекомендация. Спасибо! Пожалуйста, сделайте этот ответ лучше, показывая, как можно включить эту функцию. Я искал в настройках и не могу найти эту опцию. FWIW, я бегу terminator v1.91 . @AnthonyK Есть два не связанных между собой эмулятора терминала terminator , которые имеют одно и то же имя : этот, на который ссылается гостья, и тот, который вы используете.

Два хороших ответа / примеры здесь

Одно предостережение: по крайней мере, на встроенном терминале на моем 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, он должен работать на любом из указанных терминалов.


Команда 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


2) Удаление символов с помощью tr

Опция -d используется для удаления всех символов, которые указаны в наборе символов.

Следующая команда удалит все цифры в тексте. Будем использовать набор [:digit:] , чтобы определить все цифры.

А вот пример команд, которыми можно удалить переносы на новые строки


3) Удаление ила змена символов НЕ в наборе

С помощью параметра -c Вы можете сказать tr заменить все символы, которые Вы не указали в наборе. Приведем пример.

А вот пример удаления, просто укажем опцию -d и только один набор (символы которого удалять НЕ надо, а остальные удалить)


4) Замена пробелов на табуляцию

5) Удаление повторений символов

Это делает параметр -s . Рассмотрим пример удаления повторов знаков.

Или заменим повторения на символ решетки

6) Заменить символы из набора на перенос строки

Сделаем так, чтобы все буквы были заменены на перенос новой строки:


7) Генерируем список уникальных слов из файла

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

8) Кодируем символы с помошью ROT

Давайте проверим, как использовать tr для шифрования.

В следующем примере каждый символ в первом наборе будет заменен соответствующим символом во втором наборе.

Первый набор [a-z] (это значит abcdefghijklmnopqrstuvwxyz). Второй набор [n-za-m] (который содержит pqrstuvwxyzabcdefghijklmn).

Простая команда для демонстрации вышеуказанной теории:

Полезно при шифровании электронных адресов:

Вывод

Если у Вас есть какие-либо дополнения, не стесняйтесь пишите в комментариях.

Читайте также: