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

Обновлено: 05.07.2024

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

Вы уже знаете команды grep, awk и sed, которые специализируются на манипулировании текстовыми данными, и мы будем использовать эту команду для удаления пустых строк в Linux.

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

В этом руководстве мы увидим, как удалить пустые строки из файла в Linux, используя следующие пять методов.

  • Команда sed: потоковый редактор для фильтрации и преобразования текста.
  • Команда grep: вывести строки, соответствующие шаблону.
  • Команда cat: объединяет файлы и печатает на стандартном выходе.
  • Команда tr: перевод или удаление символов.
  • Команда awk: Утилита awk должна выполнять программы, написанные на языке программирования awk, специализированном для манипулирования текстовыми данными.
  • Команда perl: Perl – это язык программирования, специально разработанный для редактирования текста.

Чтобы доказать это, я уже создал файл 2daygeek.txt с некоторыми текстами и пустыми строками, которые показаны ниже:

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

1) Удаление пустых строк из файла с помощью команды sed

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

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

Подробности ниже:

  • sed: это команда
  • //: Содержит искомую строку.
  • ^: соответствует началу строки.
  • $: соответствует концу строки.
  • d: удалить совпавшую строку.
  • 2daygeek.txt: имя исходного файла.

2) Удаление пустых строк из файла с помощью команды grep

grep расшифровывается как Global Regular Expression Print. Он используется для поиска текста и строк в заданном файле и печатает каждую строку, соответствующую шаблону.

Подробности ниже:

  • grep: это команда
  • .: Заменяет любой символ.
  • ^: соответствует началу строки.
  • $: соответствует концу строки.
  • E: для расширенного сопоставления шаблонов регулярных выражений.
  • e: для сопоставления шаблонов регулярных выражений.
  • v: выбор несовпадающих строк из файла.
  • 2daygeek.txt: имя исходного файла.

3) Удаление пустых строк из файла в Linux с помощью команды awk

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

Подробности ниже:

  • awk: это команда
  • //: Содержит искомую строку.
  • ^: соответствует началу строки.
  • $: соответствует концу строки.
  • .: Заменяет любой символ.
  • !: удалить совпавшую строку.
  • 2daygeek.txt: имя исходного файла.

4) Удалить пустые строки из файла с помощью команды cat и tr

кошка означает конкатенацию. Он очень часто используется в Linux для чтения данных из файла.

cat — одна из наиболее часто используемых команд в Unix-подобных операционных системах. Он предлагает три функции, связанные с текстовым файлом, такие как отображение содержимого файла, объединение нескольких файлов в один вывод и создание нового файла.

Мы можем легко удалить пустые строки в файле, комбинируя команды «cat» и «tr», как показано ниже:

Подробности ниже:

  • кот: Это команда
  • tr: ​​это команда
  • |: символ трубы. Он передает первый вывод команды в качестве входных данных для другой команды.
  • s: заменить каждую последовательность повторяющихся символов, которая указана в последнем указанном наборе.
  • \n: добавить новую строку.
  • 2daygeek.txt: имя исходного файла.

5) Удалить пустые строки из файла в Linux с помощью команды perl

Perl расшифровывается как «Практический язык извлечения и составления отчетов». Perl — это язык программирования, специально разработанный для редактирования текста. В настоящее время он широко используется для различных целей, включая системное администрирование Linux, сетевое программирование, веб-разработку и т. д.

Подробности ниже:

  • grep: это команда
  • .: Заменяет любой символ.
  • ^: соответствует началу строки.
  • $: соответствует концу строки.
  • E: для расширенного сопоставления шаблонов регулярных выражений.
  • e: для сопоставления шаблонов регулярных выражений.
  • v: выбор несовпадающих строк из файла.
  • 2daygeek.txt: имя исходного файла.

Заключительные примечания

В этом руководстве мы показали, как удалить пустые/пустые строки из файла в Linux.


В вашей "пустой" строке могут быть пробелы или символы табуляции. Используйте классы POSIX с sed для удаления всех строк, содержащих только пробелы:

Укороченная версия, использующая ERE, например, с gnu sed:

(Обратите внимание, что sed НЕ поддерживает PCRE.)


@BernieReiter ^\s*$ будет соответствовать всем «пустым» строкам, пустое здесь означает, что строка не содержит символов или строка содержит только пустые строки (например, пробелы). Все совпадающие строки будут удалены с помощью sed с помощью команды d.

Мне не хватает решения awk:

Что вернет:

Как это работает? Поскольку NF означает «количество полей», эти пустые строки имеют 0 полей, так что awk оценивает 0 как False, и ни одна строка не печатается; однако, если есть хотя бы одно поле, оценка имеет значение True и заставляет awk выполнять действие по умолчанию: печатать текущую строку.


И это намного быстрее, хотя - для быстрого и грязного теста - я вызываю awk дважды: $ time (тема company real 0m0.006s user 0m0.000s sys 0m0.008s $ time (topic company real 0m0.014s user 0m0.002s sys 0m0.006s Знаете ли вы отличный способ включить это в awk-скрипт, например, шаблон? awk '/mypattern/ '

sed '/^$/d' должно подойти, вы хотите изменить файл на месте? Если это так, вы должны использовать флаг -i.

Возможно, эти строки не пусты, поэтому в этом случае посмотрите на этот вопрос. Удалите пустые строки из txt-файлов, удалите пробелы в начале и в конце строки. Я думаю, это то, чего вы пытаетесь достичь.


Они правильно отображаются в вашем онлайн-инструменте, но [] не должно не экранироваться выражением в квадратных скобках, поэтому приведенный здесь код неверен для \[\[:space:\]\ ] или \[ \t\] - должно быть [[:space:]] и [ \t] .

@БенджаминВ. Спасибо, что поймали это. Они были не от оригинального автора, а пришли из Edit 3, когда он был изменен с обычного текста на «код», который затем «обнажил» экранирование `\`. Я исправил их сейчас.

Я считаю, что это самый простой и быстрый способ:

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


Да, я знаю, но в первоначальном вопросе не упоминалось, является ли источник файлом или чем-то еще, поэтому решение — это то, что следует после «|», а перед ним просто пример источника. Просто чтобы отличить решение от источника строк.

grep '\S' определенно не переносим. Если у вас есть grep -P, вы можете использовать grep -P '\S', но он также поддерживается не на всех платформах.

Недостаток grep . по сравнению с другими решениями заключается в том, что он будет выделять весь текст красным цветом. Другие решения могут сохранить исходные цвета. Сравните unbuffer apt search foo | грэп . разбуферить apt search foo | grep -v ^$

С помощью принятого ответа здесь и принятого ответа выше я использовал:

Это охватывает все основы и идеально подходит для моих нужд. Престижность авторам оригинальных постеров @Kent и @kev


Другой вариант без sed , awk , perl и т.д.

strings — вывести строки печатных символов в файлах.



Скорее всего, вы наблюдаете неожиданное поведение, потому что ваш текстовый файл был создан в Windows, поэтому последовательность строк в конце — \r\n . Вы можете использовать dos2unix для преобразования его в текстовый файл в стиле UNIX перед запуском sed или использовать

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



Здравствуйте, что делает флаг -r и можно ли его совместить с -i, чтобы изменить файл напрямую и избежать вывода на экран. Кроме того, я думаю, что эта команда также будет работать как sed -r "/^\r$/d"

Команда, которую вы пытаетесь использовать, верна, просто используйте с ней флаг -E.

Флаг

-E заставляет sed перехватывать расширенные регулярные выражения. Подробнее здесь


Вы можете сделать что-то подобное и с помощью grep:

Это работает и в awk.

Мой ответ, специфичный для bash, заключается в том, чтобы рекомендовать использовать для этого оператор подстановки perl с глобальным флагом шаблона g следующим образом:

Этот ответ иллюстрирует учет того, есть ли в пустых строках пробелы ( [\ ]* ), а также использование | для разделения нескольких поисковых терминов/полей. Протестировано на macOS High Sierra и CentOS 6/7.

К вашему сведению, исходный код OP sed '/^$/d' $file отлично работает в терминале bash на macOS High Sierra и CentOS 6/7 Linux в высокопроизводительном суперкомпьютерном кластере.

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

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

Создание файла с пустыми/пустыми строками в Linux

Нам нужно создать справочный файл с несколькими пустыми строками. Позже мы изменим его в статье с помощью нескольких методов, которые мы обсудим. В своем терминале создайте текстовый файл по вашему выбору с именем, например, «i_have_blanks», и заполните его некоторыми данными и пробелами.

 Создать файл с пустыми строками

Создать файл с пустыми строками

На протяжении всей статьи мы будем выводить содержимое файла на наш терминал, используя команду cat для гибких ссылок.

 Просмотр содержимого файла в Linux

Просмотр содержимого файла в Linux

Три команды Linux, которые подтолкнут нас к идеальному решению этой проблемы с пустыми/пустыми строками, — это grep, sed и awk.

Поэтому создайте три копии файла i_have_blanks.txt и сохраните их под разными именами, чтобы каждая из них могла быть обработана одной из трех указанных команд Linux.

С помощью регулярного выражения (регулярных выражений) мы можем идентифицировать пустые строки с помощью стандартного символа POSIX «[:space:]».

Как удалить пустые/пустые строки в файлах

С этой постановкой задачи мы рассматриваем удаление всех существующих пустых/пустых строк из заданного читаемого файла с помощью следующих команд.

1. Удалить пустые строки с помощью команды Grep

Поддерживаемое использование сокращенных классов символов может упростить команду grep до простой, например:

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

Удалить пустые строки в файле с помощью Grep

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

Как видите, все пустые строки, разделявшие содержимое этого текстового файла, исчезли.

2. Удалить пустые строки с помощью команды Sed

Действие d в команде указывает удалить все существующие пробелы из файла. Механизм сопоставления и удаления пустых строк этой команды можно представить следующим образом.

Приведенная выше команда просматривает строки текстового файла в поисках непустых символов и удаляет все остальные оставшиеся символы. Благодаря поддержке класса непустых символов приведенную выше команду можно упростить до следующего:

Кроме того, поскольку команда поддерживает редактирование на месте, нам не нужен временный файл для временного хранения преобразованного файла перед перезаписью исходного текстового файла, как в случае с командой grep. Однако вам нужно использовать эту команду с параметром -i в качестве аргумента.

Удалить пустые строки в файле с помощью Sed

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

3. Удалить пустые строки с помощью команды Awk

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

Интерпретация приведенной выше команды проста: печатаются только те строки файла, которые не существуют в виде пробелов. Более длинная версия приведенной выше команды будет выглядеть примерно так:

Благодаря поддержке класса непустых символов в awk приведенная выше команда также может быть представлена ​​следующим образом:

Удалить пустые строки в файле с помощью Awk

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

Опция -d an позволяет awk вывести последние строки файла на системный терминал. Как видите, в файле больше нет пробелов.

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

Я хотел бы удалить пустые строки в начале и в конце файла, но не удалять пустые строки между непустыми строками в середине. Я думаю, что 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 '' печатает 0 , но если мы укажем разделитель полей: echo $' \t \t ' | awk -F '\t' '' печатает 3

Если файл достаточно мал и соответствует требованиям к памяти:

  • -0777, чтобы проглотить весь входной файл
  • ^\n+ один или несколько символов новой строки от начала строки
  • \n\K, чтобы предотвратить удаление символа новой строки последней непустой строки
  • \n+$ один или несколько символов новой строки в конце строки


Будет напечатан весь текст, кроме пустых строк в начале и конце. Итак, если мы расширим пример:



Умно. Хитрость здесь в том, что подстановка команды ( $(cat file) ) удаляет завершающие символы новой строки. Я бы предложил 2 предложения: 1) использовать встроенную функцию bash $( вместо cat; 2) использовать здесь строку: sed '/[^[:blank:]]/,$!d'

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

В приведенном выше примере строки, состоящие только из пустых символов, считаются пустыми. Если вместо этого вы хотите, чтобы строки без символов считались пустыми, просто измените NF на /./ .

Расширение на @schrodigerscatcuriosity command-substitiution-trick:

Думаю, для магии оболочек еще есть место.


Использование Raku (ранее известного как Perl_6):

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

Входной файл тот же, что и @schrodigerscatcuriosity (две пустые строки в начале файла, две пустые строки в конце файла). А если вам нужно очистить только начало/конец файла (файлов), то обрезка начала и обрезки конца вам в помощь.

В качестве альтернативы ниже приведен довольно простой перевод кода Perl5 @Sundeep с использованием нескольких функций Raku:

Для перевода Perl5 в Raku: файл обрабатывается с помощью -ed и используется оператор неразрушающей подстановки Raku S/// для возвращения результирующей строки. Чередование осуществляется с помощью || Раку. оператор чередования «первого совпадения», так как Раку | оператор чередования обозначает самое длинное сопоставление токенов (LTM, улучшение).

Раку-эквивалент команд Perl5 /k и/или /K — это просто , используемые по отдельности или в виде парного набора. Эти операторы указывают механизму регулярных выражений отбрасывать все совпадения до или после )> . [Обратите внимание, однако, что эквивалент \K в Raku кажется ненужным для рассматриваемой проблемы].

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