Напишите скрипт, удаляющий пустые строки из текстового файла
Обновлено: 21.11.2024
Есть два возможных метода удаления пустых строк из текстового файла с помощью sed; методы перечислены ниже и подробно обсуждаются в следующей части этого руководства.
- Способ 1. Как удалить все пустые строки в текстовом файле с помощью sed
- Способ 2. Как удалить определенные строки из текстового файла с помощью sed
Способ 1. Как удалить все пустые строки в текстовом файле с помощью sed
Прежде чем углубляться в суть этого метода, давайте разберемся с синтаксисом удаления пустых строк с помощью sed:
Синтаксис
Основной частью этой команды является ‘/^$/d’; где символ «^» показывает, что удаление должно быть выполнено с начала, т.е. с первой строки; «$» означает, что он должен идти до последней строки текстового файла, а «d» показывает, что удаление выполняется.
В этом разделе вы узнаете, как удалить все строки в текстовом файле с помощью потокового редактора (sed):
Мы создали текстовый файл «delete.txt; во-первых, получите содержимое этого файла с помощью команды «cat», как указано ниже, и мы использовали с ней параметр «-n», чтобы мы также могли получить номера строк:
Обнаружено, что имеется несколько пустых строк, и они влияют на внешний вид этого текстового файла, и читатели могут не обращать внимания на такое содержимое.
Итак, чтобы избежать описанной выше ситуации; вы должны удалить пустые строки, чтобы упростить процесс чтения; указанная ниже команда удалит все эти строки из файла «delete.txt».
Теперь вы можете заметить, что пустые строки размыты и печатаются только те строки, которые содержат текст, но результат отображается только на терминале, а исходный файл остается прежним:
Если вы хотите удалить пустые строки и также обновить исходный файл, вы должны использовать встроенную опцию «-i», и приведенная ниже команда поможет вам сделать это:
Способ 2. Как удалить выделенные пустые строки в текстовом файле с помощью sed
Синтаксис для удаления определенных строк в текстовом файле описан ниже:
Синтаксис
Основная часть синтаксиса, на которую опирается команда, это «(номер строки)d’»; вы должны указать точный номер пустой строки в «(номер строки)», а буква «d» показывает, что вставленный номер строки будет удален:
Вы можете удалить определенные строки внутри текстового файла с помощью команды sed; мы создали новый текстовый файл «new.txt» для этого раздела. Например, вывод приведенной ниже команды показывает, что строка номер «2» пуста:
И если вы хотите запустить команду для удаления только этой строки, вам нужно указать номер строки, как мы сделали в команде, упомянутой ниже:
Используя этот метод, вы также можете удалить последовательные строки; например, файл «new.txt» содержит 3 пустые строки «4,5,6», как видно на изображении ниже:
Чтобы удалить эти три строки подряд; вы должны вставить «,» между начальным и конечным номерами строк, как показано в приведенной ниже команде:
Наконец, вы также можете использовать вместо параметра «-i» для постоянного сохранения изменений в файле, так как без этого параметра команда sed выводит результат на терминал, поскольку мы изменили приведенную выше команду, чтобы использовать ее с «- i” вариант:
Заключение
Ubuntu поддерживает несколько способов управления данными в текстовом файле; например, вы можете использовать стандартный текстовый редактор Ubuntu, редактор nano и т. д. Однако утилита командной строки sed в Ubuntu опережает все эти редакторы благодаря своим функциям, таким как доступ к файлу из терминала и внесение изменений без его открытия. В этой статье мы использовали команду sed для удаления пустых строк из текстового файла и описали два метода этой операции. «Способ 1» особенно подходит, когда у вас есть сотни строк в текстовом файле, и вы хотите удалить все пустые строки сразу: С другой стороны, «Способ 2» подходит для удаления пустых строк в небольшом документе, где вы можно удалять строки по одной. Однако вам придется искать пустые строки самостоятельно, если вы хотите следовать «Способу 2»: Таким образом, если сравнивать оба метода, «Способ 1» превосходит «Способ 2» в отношении удаления пустых строк.
Привет, сценарист! Как удалить все пустые строки из текстового файла?
Привет, РЭ. Вы знаете, еще в 2002 году, когда Scripting Guys были еще просто парнями, писавшими строчные буквы, мы начали работать над Microsoft Windows 2000 Scripting Guide. При составлении книги мы столкнулись с огромным сопротивлением со стороны людей, которые считали ошибкой даже упоминание о текстовых файлах. Почему? Потому что никто больше не использует текстовые файлы, и нам было глупо тратить время на мертвую технологию.
Примечание. Хотите верьте, хотите нет, но мы также столкнулись с огромным сопротивлением включению главы о VBScript, хотя эта книга была предназначена для обучения людей тому, как писать сценарии с использованием VBScript. Но это уже другая история.
Какая во всем этом мораль? Сейчас 2006 год, и первый вопрос, который поднимается в журнале Hey, Scripting Guy! столбец имеет дело с текстовыми файлами. Неплохо для мертвой технологии, которой никто не пользуется, правда?
Мы предполагаем, что у вас есть текстовый файл, который выглядит примерно так:
Вы бы хотели, чтобы текстовый файл выглядел так:
Можно ли сделать это с помощью скрипта? Конечно можно:
Давайте поговорим об основной идее, прежде чем мы перейдем к мельчайшим деталям работы скрипта. Как вы, наверное, знаете, манипулирование текстовыми файлами часто требует обходных путей. Сегодняшний сценарий не исключение. Поскольку мы не можем напрямую редактировать текстовый файл, вместо этого мы должны сделать следующее: сначала мы читаем текстовый файл построчно. Читая каждую строку, мы проверяем, не пуста ли она. Если это так, мы отбрасываем его; если это не так, мы добавляем эту строку (вместе с любыми другими непустыми строками) в переменную с именем strNewContents. Когда мы закончим чтение файла, мы закроем его, а затем сразу же снова откроем для записи. (Одна из капризов работы с текстовыми файлами: вы можете читать из файла или писать в файл, но вы не можете делать и то, и другое одновременно.) Затем мы записываем значение strNewContents в файл. Конечный результат: мы получаем файл, в котором нет пустых строк.
Все это есть? OK. Теперь давайте пройдемся по сценарию шаг за шагом.
Начнем с определения пары констант с именами ForReading и ForWriting; мы будем использовать эти константы, чтобы указать соответствующий режим при открытии нашего текстового файла. Затем мы используем эти две строки кода для создания экземпляра Scripting.FileSystemObject, а затем открываем файл C:\Scripts\Test.txt для чтения:
Далее у нас есть этот блок кода:
Здесь мы читаем файл построчно, начиная с начала и заканчивая, ну, ну, в конце. (Как мы узнаем, что достигли конца файла? Если свойство AtEndOfStream равно True.)
Внутри этого цикла мы используем метод ReadLine для чтения первой строки текстового файла и сохранения ее в переменной с именем strLine. Затем мы используем эту строку кода и функцию Trim, чтобы удалить все пробелы в начале и/или конце строки:
Зачем мы это делаем? Предположим, у вас есть куча строк, состоящих из одного пробела. Мы предполагаем, что вы считаете их пустыми строками и хотите, чтобы они были удалены. Если вы не хотите удалять эти строки, просто удалите эту строку кода из скрипта:
Сейчас мы используем функцию Len для определения количества символов в строке. Если Len больше 0, то это не пустая строка; следовательно, мы добавляем строку (плюс возврат каретки-перевод строки) в переменную с именем strNewContents:
И да, мы добавляем эту строку к тому, что в данный момент находится в переменной strNewContents. Вот почему мы объединяем существующее значение strNewContents и переменную strLine, а также перевод строки (используя константу VBScript vbCrLf).
Но что, если Len не больше 0? Если это так, то у нас есть пустая строка, и мы не добавляем ее в strNewContents.Затем мы зацикливаемся и повторяем процесс для следующей строки в текстовом файле.
После закрытия файла C:\Scripts\Test.txt мы снова открываем его (на этот раз для записи) и вызываем метод Write для записи значения strNewContents в файл. Почему? Это просто: поскольку strNewContents состоит из всех строк исходного текстового файла, кроме пустых строк; они никогда не добавлялись в strNewContents. Так, где это оставляет нас? Вы угадали:
Опытный пользователь Linux точно знает, какие неприятные пустые строки могут быть в обрабатываемом файле. Эти пустые строки не только мешают правильной обработке таких файлов, но и затрудняют чтение и запись файла работающей программой.
В среде операционной системы Linux можно реализовать несколько выражений для работы с текстом, чтобы избавиться от этих пустых/пустых строк из файла. В этой статье пустые/пустые строки относятся к пробельным символам.
Создание файла с пустыми/пустыми строками в Linux
Нам нужно создать справочный файл с несколькими пустыми строками. Позже мы изменим его в статье с помощью нескольких методов, которые мы обсудим. В своем терминале создайте текстовый файл по вашему выбору с именем, например, «i_have_blanks», и заполните его некоторыми данными и пробелами.
Создать файл с пустыми строками
На протяжении всей статьи мы будем выводить содержимое файла на наш терминал, используя команду cat для гибких ссылок.
Просмотр содержимого файла в Linux
Три команды Linux, которые подтолкнут нас к идеальному решению этой проблемы с пустыми/пустыми строками, — это grep, sed и awk.
Поэтому создайте три копии файла i_have_blanks.txt и сохраните их под разными именами, чтобы каждая из них могла быть обработана одной из трех указанных команд Linux.
С помощью регулярного выражения (регулярных выражений) мы можем идентифицировать пустые строки с помощью стандартного символа POSIX «[:space:]».
Как удалить пустые/пустые строки в файлах
С этой постановкой задачи мы рассматриваем удаление всех существующих пустых/пустых строк из заданного читаемого файла с помощью следующих команд.
1. Удалить пустые строки с помощью команды Grep
Поддерживаемое использование сокращенных классов символов может упростить команду grep до простой, например:
Чтобы исправить файл с пустыми/пустыми строками, приведенный выше вывод должен пройти через временный файл перед перезаписью исходного файла.
Удаление пустых строк в файле с помощью Grep
Как видите, все пустые строки, разделявшие содержимое этого текстового файла, исчезли.
2. Удалить пустые строки с помощью команды Sed
Действие d в команде указывает удалить все существующие пробелы из файла. Механизм сопоставления и удаления пустых строк этой команды можно представить следующим образом.
Приведенная выше команда просматривает строки текстового файла в поисках непустых символов и удаляет все остальные оставшиеся символы. Благодаря поддержке класса непустых символов приведенную выше команду можно упростить до следующего:
Кроме того, поскольку команда поддерживает редактирование на месте, нам не нужен временный файл для временного хранения преобразованного файла перед перезаписью исходного текстового файла, как в случае с командой grep. Однако вам нужно использовать эту команду с параметром -i в качестве аргумента.
Удаление пустых строк в файле с помощью Sed
3. Удалить пустые строки с помощью команды Awk
Команда awk выполняет проверку небелых символов в каждой строке файла и печатает их только в том случае, если это условие выполняется. Гибкость этой команды обеспечивается различными путями реализации. Его простое решение выглядит следующим образом:
Интерпретация приведенной выше команды проста: печатаются только те строки файла, которые не существуют в виде пробелов. Более длинная версия приведенной выше команды будет выглядеть примерно так:
Благодаря поддержке класса непустых символов в awk приведенная выше команда также может быть представлена следующим образом:
Удаление пустых строк в файле с помощью Awk
Опция -d an позволяет awk вывести последние строки файла на системный терминал. Как видите, в файле больше нет пробелов.
Три рассмотренных и реализованных решения для работы с пустыми строками в файлах с помощью команд grep, sed и awk помогут нам реализовать стабильные и эффективные операции чтения и записи файлов в системе Linux.
Пустые строки не всегда желательны, и вы можете счесть нужным исключить их и оставить только те строки, которые содержат текст. Linux предлагает пару выражений для работы с текстом, которые можно использовать для пропуска или удаления пустых строк. Давайте рассмотрим некоторые инструменты командной строки, которые можно использовать для удаления пустых строк в текстовом файле.
Я использовал CentOS 8 в демонстрационных целях.
Удалить пустые строки с помощью команды grep
Grep — один из самых мощных и универсальных инструментов, с помощью которого можно удалить ненужные пустые строки из текстовых файлов. Обычно эта команда используется для проверки строк или шаблонов символов в текстовом файле, но, как вы вскоре увидите, она также может помочь вам избавиться от нежелательных пустых строк
При использовании с параметром -v команда grep помогает удалить пустые строки. Ниже приведен пример текстового файла sample.txt с альтернативными непустыми и пустыми строками.
Чтобы удалить или удалить все пустые строки в образце текстового файла, используйте команду grep, как показано ниже.
Кроме того, вы можете использовать следующий синтаксис.
Кроме того, вы можете сохранить или перенаправить вывод в другой файл, например, с помощью оператора "больше" ( > ).
Удалить пустые строки с помощью команды sed
Команда Linux sed, сокращенно называемая редактором потока, является популярным инструментом, выполняющим широкий спектр функций, включая замену и подстановку строк в файле.
Кроме того, вы также можете использовать sed для удаления пустых строк в файле, как показано ниже.
Удалить пустые строки с помощью команды awk
Наконец, у нас есть команда awk. Это еще один инструмент командной строки для манипуляций с тетами, который также может избавиться от пустых строк. Чтобы удалить пустой файл с помощью awk, вызовите приведенную ниже команду.
Заключение
Мы предоставили 3 способа удаления пустых строк в текстовых файлах. Любые другие идеи о том, как удалить эти ненужные пустые строки? Свяжитесь с нами в разделе комментариев.
Об авторе
Карим Буздар
Карим Буздар имеет степень инженера в области телекоммуникаций и несколько сертификатов системного администратора. Как ИТ-инженер и технический автор, он пишет для различных веб-сайтов. Он ведет блог на LinuxWays.
Я хотел бы удалить пустые строки в начале и в конце файла, но не удалять пустые строки между непустыми строками в середине. Я думаю, что sed или awk будут решением.
10 ответов 10
Чтобы удалить пустые строки в начале файла:
Чтобы удалить пустые строки в конце файла:
Чтобы удалить пустые строки в начале и в конце файла:
-e script, --expression=script -> добавить скрипт к командам, которые будут выполняться
b label -> Перейти к метке; если метка не указана, переход к концу скрипта.
a -> Добавить текст после строки (альтернативный синтаксис).
$ -> Сопоставить последнюю строку.
n N -> Добавить новую строку в пространство шаблонов, затем добавить следующую строку ввода в пространство шаблонов. Если ввода больше нет, sed завершает работу без обработки каких-либо команд.
Обратите внимание, что -i является непереносимым расширением утилиты POSIX sed и будет доступно не во всех системах.
я вижу, что эти команды работают, но не совсем понимаю, как это сделать. Не могли бы вы объяснить их более подробно? В частности, почему во втором примере первое предложение не удаляет встроенные пустые строки? Почему второе предложение должно зацикливаться? Похоже, он получает кучу новых строк одновременно. Работает ли что-нибудь из этого на строках, содержащих только пробелы, или вы считаете их непустыми?
Лучше сделать что-то вроде ^[[:space:]]$ вместо просто новой строки, так как существуют типы новых строк для DOS, Linux и Mac, которые могут запутать вас, если вы просто попытаетесь удалить один вид символов новой строки. их.
Что касается предостережения @AndrewHenle, команда работает так же хорошо для потоковой передачи, если вы не хотите беспокоиться о разнице между GNU -i и BSD -i ''
Эта небольшая программа awk удалит пустые строки в начале файла:
Таким образом, мы можем объединить это с tac, который переворачивает линии и получить:
Кража трюка с подстановкой команд @guillermo chamorro:
Это хороший вопрос. Мне кажется, что если мы используем FS по умолчанию, пустые строки игнорируются: echo $' \t \t ' | awk '
Если файл достаточно мал и соответствует требованиям к памяти:
- -0777, чтобы проглотить весь входной файл
- ^\n+ один или несколько символов новой строки от начала строки
- \n\K, чтобы предотвратить удаление символа новой строки последней непустой строки
- \n+$ один или несколько символов новой строки в конце строки
Будет напечатан весь текст, кроме пустых строк в начале и конце. Итак, если мы расширим пример:
Умно. Хитрость здесь в том, что подстановка команды ( $(cat file) ) удаляет завершающие символы новой строки. Я бы предложил 2 предложения: 1) использовать встроенную функцию bash $(
В приведенном выше примере строки, состоящие только из пустых символов, считаются пустыми. Если вместо этого вы хотите, чтобы строки без символов считались пустыми, просто измените NF на /./ .
Расширение на @schrodigerscatcuriosity command-substitiution-trick:
Думаю, для магии оболочек еще есть место.
Использование Raku (ранее известного как Perl_6):
Если файл считывается в Raku со строками , то умное использование функции обрезки может быть использовано для очистки пустых строк (т. е. пробелов) в начале и конце файла:
Входной файл тот же, что и @schrodigerscatcuriosity (две пустые строки в начале файла, две пустые строки в конце файла). А если вам нужно очистить только начало/конец файла (файлов), то обрезка начала и обрезки конца вам в помощь.
В качестве альтернативы ниже приведен довольно простой перевод кода Perl5 @Sundeep с использованием нескольких функций Raku:
Для перевода Perl5 в Raku: файл обрабатывается с помощью -ed и используется оператор неразрушающей подстановки Raku S/// для возвращения результирующей строки. Чередование осуществляется с помощью || Раку. оператор чередования «первого совпадения», так как Раку | оператор чередования обозначает самое длинное сопоставление токенов (LTM, улучшение).
Раку-эквивалент команд Perl5 /k и/или /K — это просто <( . )>, используемые по отдельности или в виде парного набора. Эти операторы указывают механизму регулярных выражений отбрасывать все совпадения до <( или после )>. [Обратите внимание, однако, что эквивалент \K в Raku кажется ненужным для рассматриваемой проблемы].
Читайте также: