Удалить пустые строки в файле
Обновлено: 21.11.2024
Иногда вам может понадобиться удалить пустые строки из файла в Linux. Это можно сделать разными способами, но в этой статье мы перечислили пять лучших способов.
Вы уже знаете команды grep, awk и sed, которые специализируются на манипулировании текстовыми данными, и мы будем использовать эту команду для удаления пустых строк в Linux.
Они включены в категорию расширенных команд, поскольку часто используются в сценариях оболочки.
В этом руководстве мы увидим, как удалить пустые строки из файла в Linux, используя следующие пять методов.
- Команда sed: потоковый редактор для фильтрации и преобразования текста.
- Команда grep: вывести строки, соответствующие шаблону.
- Команда cat: объединяет файлы и печатает на стандартном выходе.
- Команда tr: перевод или удаление символов.
- Команда awk: Утилита awk должна выполнять программы, написанные на языке программирования awk, специализированном для манипулирования текстовыми данными.
- Команда perl: Perl – это язык программирования, специально разработанный для редактирования текста.
Чтобы доказать это, я уже создал файл 2daygeek.txt с некоторыми текстами и пустыми строками, которые показаны ниже:
Теперь, когда все предварительные условия выполнены, мы проверим это несколькими способами.
1) Удаление пустых строк из файла с помощью команды sed
sed — это потоковый редактор, используемый для выполнения основных преобразований текста, который также можно использовать для удаления пустых строк из файла, как показано ниже:
Подробности ниже:
- 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, которые подтолкнут нас к идеальному решению этой проблемы с пустыми/пустыми строками, — это 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.
Я хотел бы удалить пустые строки в начале и в конце файла, но не удалять пустые строки между непустыми строками в середине. Я думаю, что 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 $( вместо 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 кажется ненужным для рассматриваемой проблемы].
Читайте также: