Удалить пустые строки linux

Обновлено: 04.07.2024

Команда tr может выполнять такие операции, как удаление повторяющихся символов, преобразование верхнего регистра в нижний регистр, а также замену и удаление основных символов. Обычно он используется в сочетании с другими командами через конвейер.

В этом руководстве мы покажем вам, как использовать команду tr на практических примерах и подробных объяснениях наиболее распространенных параметров.

Как использовать команду tr

Синтаксис команды tr следующий:

tr принимает два набора символов, обычно одинаковой длины, и заменяет символы из первых наборов соответствующими символами из второго набора.

В следующем примере tr заменит все символы из стандартного ввода (linuxize), сопоставив символы из первого набора с соответствующими символами из второго набора.

Каждое вхождение l заменяется на r , i на e и n на d :

Наборы символов также можно определить с помощью диапазонов символов. Например, вместо написания:

вы можете использовать:

Когда используется опция -c ( --complement ), tr заменяет все символы, которых нет в SET1.

В приведенном ниже примере все символы, кроме «li», будут заменены последним символом из второго набора:

Как вы могли заметить, вывод выше имеет на один видимый символ больше, чем ввод. Это связано с тем, что команда echo печатает невидимый символ новой строки n который также заменяется на y . Чтобы отобразить строку без новой строки, используйте параметр -n .

Параметр -d ( --delete ) указывает tr удалить символы, указанные в SET1. При удалении символов без сжатия укажите только один набор.

Приведенная ниже команда удалит символы l , i и z :

Параметр -s ( --squeeze-repeats ) заменяет последовательность повторяющихся вхождений на набор символов из последнего набора.

В следующем примере tr удаляет повторяющиеся пробелы:

Когда используется SET2, последовательность символов, указанная в SET1, заменяется на SET2.

Параметр -t ( --truncate-set1 ) заставляет tr усечь SET1 до длины SET2 перед выполнением дальнейшей обработки.

По умолчанию, если SET1 больше, чем SET2, tr будет повторно использовать последний символ SET2. Вот пример:

Выходные данные показывают, что символ e из SET1 соответствует последнему символу SET2, который равен 2 :

Теперь используйте ту же команду с параметром -t :

Варианты комбинирования

Команда tr также позволяет комбинировать ее параметры. Например, следующая команда сначала заменяет все символы, кроме i на 0 а затем сжимает повторяющиеся символы 0 :

Примеры команд Tr

В этом разделе мы рассмотрим несколько примеров распространенного использования команды tr .

Преобразовать нижний регистр в верхний регистр

Вместо классов символов вы также можете использовать диапазоны:

Чтобы преобразовать верхний регистр в нижний, просто поменяйте местами наборы.

Удалить все нечисловые символы

Следующая команда удаляет все нечисловые символы:

[:digit:] обозначает все цифровые символы, а при использовании опции -c команда удаляет все нецифровые символы. Результат будет выглядеть так:

Поместите каждое слово в новую строку

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

Удалить пустые строки

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

В приведенной выше команде мы используем символ перенаправления < для передачи содержимого file.txt команде tr . Перенаправление > записывает вывод команды в new_file.txt .

Вывести каталоги $PATH в отдельной строке

Переменная среды $PATH представляет собой список каталогов, разделенных двоеточиями, который сообщает оболочке, в каких каталогах следует искать исполняемые файлы при вводе команды.

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

Выводы

Хотя это очень полезно, tr может работать только с отдельными символами. Для более сложных сопоставлений с образцом и обработки строк следует использовать sed или awk .

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

Мне нужно удалить все пустые строки из входного файла и записывать в выходной файл. Вот мои данные, как показано ниже.

это говорит sed удалить каждую строку, соответствующую регулярному выражению ^$ т. е. каждая пустая строка. The -i флаг редактирует файл на месте, если ваш sed не поддерживает, что вы можете написать вывод во временный файл и замените оригинал:

если вы также хотите удалить строки, состоящие только из пробелов (а не только пустых строк), используйте:

Edit: также удалить пробелы в конце строк, потому что по-видимому, вы решили, что вам это тоже нужно:

NF также удаляет строки, содержащие только пробелы или вкладки, регулярное выражение /^$/ нет.

использовать grep чтобы соответствовать любой линии, которая не имеет ничего между стартовым якорем ( ^ ) и конец якоря ( $ ):

если вы хотите удалить строки только с пробелами, вы все равно можете использовать grep. Я использую регулярные выражения Perl в этом примере, но вот другие способы:

или, без регулярных выражений Perl:

удаляет все строки, состоящие только из пробелов (или полностью пустые). Вы можете изменить пробел на [ \t] здесь \t является представлением для tab. Будь то ваша оболочка или ваш sed будет делать расширение варьируется, но вы, вероятно, можете ввести символ вкладки напрямую. И если вы используете GNU или BSD sed , вы можете сделать редактирование на месте, если это то, что вы хотите, с .

если я выполняю приведенную выше команду тем не менее, у меня есть пустые строки в моем выходном файле. Какая может быть причина?

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

новое регулярное выражение удаляет повторяющиеся пробелы в конце строки; см. предыдущее обсуждение пробелов или вкладок.

если ни один из этих работ, то вам нужно показать шестнадцатеричный дамп или восьмеричный дамп ( od -c ) из первых двух строк файла, таким образом, мы можем видеть, с чем мы столкнулись:

судя по комментариям, что sed -i не работает для вас, вы не работаете на Linux или Mac OS X или BSD-на какой платформе вы работаете? (AIX, Solaris, HP-UX приходят на ум как относительно правдоподобные возможности, но есть и множество других, менее правдоподобных.)

вы можете попробовать POSIX именованные классы символов, такие как sed -e '/^[[:space:]]*$/d' ; он, вероятно, будет работать, но не гарантируется. Вы можете попробуйте это:

grep смотрит на ваш файл строка за строкой; точка . что соответствует за исключением символ. Поэтому вывод из grep - это все строки, которые состоят из чего-то другого, чем одна новая строка.

Команда sed - это потоковый редактор текста, работающий по принципу замены. Его можно использовать для поиска, вставки, замены и удаления фрагментов в файле. С помощью этой утилиты вы можете редактировать файлы не открывая их. Будет намного быстрее если вы напишите что и на что надо заменить, чем вы будете открывать редактор vi, искать нужную строку и вручную всё заменять.

В этой статье мы рассмотрим основы использования команды sed linux, её синтаксис, а также синтаксис регулярных выражений, который используется непосредственно для поиска и замены в файлах.

Команда sed в Linux

Сначала рассмотрим синтаксис команды:

$ sed опции -e команды файл

А вот её основные опции:

  • -n, --quiet - не выводить содержимое буфера шаблона в конце каждой итерации;
  • -e - команды, которые надо выполнить для редактирования;
  • -f - прочитать команды редактирования из файла;
  • -i - сделать резервную копию файла перед редактированием;
  • -l - указать свою длину строки;
  • -r - включить поддержку расширенного синтаксиса регулярных выражений;
  • -s - если передано несколько файлов, рассматривать их как отдельные потоки, а не как один длинный.

Я понимаю, что сейчас всё очень сложно, но к концу статьи всё прояснится.

1. Как работает sed

Теперь нужно понять как работает команда sed. У утилиты есть два буфера, это активный буфер шаблона и дополнительный буфер. Оба изначально пусты. Программа выполняет заданные условия для каждой строки в переданном ей файле.

sed читает одну строку, удаляет из неё все завершающие символы и символы новой строки и помещает её в буфер шаблона. Затем выполняются переданные в параметрах команды, с каждой командой может быть связан адрес, это своего рода условие и команда выполняется только если подходит условие.

Когда всё команды будут выполнены и не указана опция -n, содержимое буфера шаблона выводится в стандартный поток вывода перед этим добавляется обратно символ перевода строки. если он был удален. Затем запускается новая итерация цикла для следующей строки.

Если не используются специальные команды, например, D, то после завершения одной итерации цикла содержимое буфера шаблона удаляется. Однако содержимое предыдущей строки хранится в дополнительном буфере и его можно использовать.

2. Адреса sed

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

  • номер - позволяет указать номер строки, в которой надо выполнять команду;
  • первая

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

3. Синтаксис регулярных выражений

Вы можете использовать такие же регулярные выражения, как и для Bash и популярных языков программирования. Вот основные операторы, которые поддерживают регулярные выражения sed Linux:

  • * - любой символ, любое количество;
  • \+ - как звездочка, только один символ или больше;
  • \? - нет или один символ;
  • \ - любой символ в количестве i;
  • \ - любой символ в количестве от i до j;
  • \ - любой символ в количестве от i и больше.

4. Команды sed

Если вы хотите пользоваться sed, вам нужно знать команды редактирования. Рассмотрим самые часто применяемые из них:

Утилите можно передать несколько команд, для этого их надо разделить точкой с запятой или использовать две опции -e. Теперь вы знаете всё необходимое и можно переходить к примерам.

Примеры использования sed

Теперь рассмотрим примеры sed Linux, чтобы у вас сложилась целостная картина об этой утилите. Давайте сначала выведем из файла строки с пятой по десятую. Для этого воспользуемся командой -p. Мы используем опцию -n чтобы не выводить содержимое буфера шаблона на каждой итерации, а выводим только то, что нам надо. Если команда одна, то опцию -e можно опустить и писать без неё:

sed -n '5,10p' /etc/group

Или можно вывести весь файл, кроме строк с первой по двадцатую:

sed '1,20d' /etc/group

Здесь наоборот, опцию -n не указываем, чтобы выводилось всё, а с помощью команды d очищаем ненужное. Дальше рассмотрим замену в sed. Это самая частая функция, которая применяется вместе с этой утилитой. Заменим вхождения слова root на losst в том же файле и выведем всё в стандартный вывод:

sed 's/root/losst/g' /etc/group

Флаг g заменяет все вхождения, также можно использовать флаг i, чтобы сделать регулярное выражение sed не зависимым от регистра. Для команд можно задавать адреса. Например, давайте выполним замену 0 на 1000, но только в строках с первой по десятую:

sed '1,10 s/0/1000/g' /etc/group

Переходим ещё ближе к регулярным выражениям, удалим все пустые строки или строки с комментариями из конфига Apache:

sed 's/[$p*]/losst_p/g' /etc/group

Если вам надо записать результат замены в обратно в файл можно использовать стандартный оператор перенаправления вывода > или утилиту tee. Например:

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

Если надо сохранить оригинальный файл, достаточно передать опции -i в параметре расширение для файла резервной копии.

Выводы

Из этой статьи вы узнали что представляет из себя команда sed Linux. Как видите, это очень гибкий инструмент, который позволяет делать с текстом очень многое. Он сложный в освоении, но с помощью него очень удобно решать многие задачи редактирования конфигурационных файлов или фильтрации вывода.

Нет похожих записей


Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.

Оцените статью:

(14 оценок, среднее: 2,64 из 5)

Об авторе

11 комментариев

Да. Было время, когда и я тоже пользовался sed-ом. Причём несколько раз.
Но потом понял -- мне проще и быстрее выполнять редактирование текста в обычном редакторе.

Если работа происходит в графической консоли (у меня Debian, MATE), то проще запустить текстовый редактор pluma. Если же нужно выполнить редактирование удалённого файла (в смысле на другом компе), то это проще сделать с помощью nano или mcedit (из пакета mc). На крайняк скопировать удалённый файл к себе на комп, изменить и вернуть обратно. Но использовать sed-ом -- 🙁 . смысл этого я что-то не очень понимаю. На минутчку! За последние лет 10 я его так ни разу по делу и не использовал, не было нужды прибегать именно к нему на фоне других редакторов текста.

А никто случаем не заметил диссонанса на скриншотах в статье? С одной стороны -- мощный компьютер с мощным процессором и гигабайтами памяти, современной видеокартой с высоким разрешением и графический рабочий стол. А с другой -- какой-то маленький потоковый редактор, которому для его работы нужно совсем ничтожное количество ресурсов компа. Которому совсем не нужна графика рабочего стола. Который, чтобы правильно запустить в работу и получить результат, которому можно верить, -- нужно ещё вспомнить как это всё делается. Что мы делаем? Какой в этом смысл?

Да, sed -- очень симпатичный и быстрый редактор. Я искренне извиняюсь, но я просто не вижу ему реальных применение. Разве что понастальгировать. Но это из области эмоций, а не технологий. Мир Линукса изменился сильно со времен, когда sed был актуален. Изменились инструменты. Изменился подход к решению задач.

sed - инструмент программиста, наиболее частая область применения - скрипты, используется обычно для автоматизации сложных деплойментов, предполагающих много рутины, чтобы ручками нужные файлы не редактировать, вся рутина выстраивается в сценарий, а потом скрипт просто исполняется на сервере. Желающие использовать его в командной строке, ну чо, пусть поупражняются, всё одно - польза и интеллектуальное развитие организма.

Спасибо!
Несколько далёк от этой области. Тоже программер, но пишу под микроконтроллеры и немного для компов (десктоп-программулины). Админка и вэб -- не моё. Не знал, что там есть применение sed-у.

Занят в embedded разработке под arm, phytec и т.п. Частенько приходилось в загрузочных скриптах или сервисных скриптах задействовать sed для автоматического парсинга логов, конфигурационных параметров системы и т.п. Утилиту sed очень удобно применять, когда входные данные на лету требуется преобразовать к требуемому для последующей переработки виду. Где кроется гемор с регулярными выражениями, так это в случаях, когда требуется автоматическое сервисное обслуживание устройств в сети по ssh. При необходимости передачи вложенных скриптовых выражений, которые частично должны интерпретироваться как чистый текст с необходимостью использования символов экранирования, а частично как команды подстановки. У меня бывали случаи, когда использование одного экранирующего символа "\" в исходном выражении могло приводить к преобразованию его к "\\\" для передачи выражения по ssh, в отдельных случаях неявное поведение баша вообще не позволяло сделать корректное эквивалентное преобразование команд для передачи по ssh. Честно говоря, регулярные выражения мне нравятся ровно до тех пор, пока из них не требуется сформировать более менее сложную команду. Это чуть ли не единственная для шелла вещь из области "Использовал при написании в скрипте, а потом через пол-года не можешь вспомнить, что эта мешанина из спец. и экранирующих символов может значить" XD

Ага. И Вам тоже спасибо!
Я задам, возможно, глупый вопрос -- а файлы, о которых Вы говорите -- загрузочные скрипты, логи и так далее -- они какие по размеру? Сколько строк или килобайт в среднем? Я просто не очень себе представляю.

Ну и мой глупый вопрос -- а почему с этими файлами лучше работать с помощью sed, а не обрабатывать их в Perl или Python?

Я совершенно не представляю специфики, поэтому могу спросить что-то не то. Извиняйте, если что.

Ещё один пример, есть резервная копия базы данных размером в 1 Гб, надо заменить все запросы INSERT на INSERT IGNORE.

Сегодня пришлось заняться: пользователь удалил несколько писем из архива за 2019 год почты Mozilla Thunderbird. Их надо восстановить. В "Удаленные" это письма, почему-то, не попали. Фактически письма всё ещё находятся в файле 2019 размером 9 Гб.
Задача: заменить все строки X-Mozilla-Status: 0009 на X-Mozilla-Status: 0001. mcedit даже на открытии такого файла уже "присел".
И вот решение: sed -i 's/X-Mozilla-Status:\ 0009/X-Mozilla-Status:\ 00091/g' 2019. Пара минут и все удалённые письма восстановлены.

Извините, ошибся: sed -i 's/X-Mozilla-Status:\ 0009/X-Mozilla-Status:\ 0001/g' 2019

linux-logo

Удаляем комментарии и пустые строки из файла на Linux. При редактировании каких-либо конфигурационных файлов, в них присутствуют закомментированные и пустые строки — это не очень удобно (по крайней мере для чтения). Файлы можно отредактировать вручную, если в нем несколько закомментированных и пустых строк, но если файл имеет тысячи таких строк, это трудно сделать вручную. Сегодня в статье научимся избавляться от лишних пустых и закомментированных строк в файле.

Что такое комментарии в программировании?

Эти строки известны как Комментарии.

В программировании комментарий — это удобочитаемое описание или аннотация, используемая для пояснения целей фрагментов кода.

Они помогают пользователям и другим программистам легко понять, что делает код.

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

Синтаксис комментариев варьируется в зависимости от языка программирования.

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

Вывод содержимого файлов без комментариев и пустых строк на Linux

Позвольте мне показать вам содержимое файла sources.list в одной из моих систем Ubuntu:

Пример вывода вышеуказанной команды:

Все комментарии и пустые строки исчезли.

Теперь вывод вполне читабелен.Я предпочитаю способом через grep фильтровать ненужные строки, отображаемые в выводе. Вы также можете сделать это с помощью команд awk и sed.

Удаление комментариев и пустых строк в файле на Linux

Давайте теперь отредактируем файл чтобы в нем не оставалось закомментированных строк.

Можно и такой командой:

Как удалить комментарии из нескольких файлов

find -name ‘*.c’ | xargs sed -i ‘0,/^*\/$/d’

Если есть вопросы, то пишем в комментариях.

Также можете вступить в Телеграм канал, ВК или подписаться на Twitter. Ссылки в шапки страницы.
Заранее всем спасибо.

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