Удалите пустые строки с помощью sed

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

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

Синтаксис

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

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

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

sed --help

Замена слова

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

  • Для первого вхождения:
    sed 's/команды/инструкции/' firstfile.txt
  • Для всех вхождений (используется параметр инструкции — g):
    sed 's/команды/инструкции/g' firstfile.txt
  • Замена подстроки с несколькими условиями (используется ключ — -e):
    sed -e 's/команды/инструкции/g' -e 's/команд/инструкций/g' firstfile.txt
  • Заменить часть строки, если она содержит определенный набор символов (например, POSIX):
    sed '/POSIX/s/Bash/оболочка/g' firstfile.txt
  • Выполнить замену во всех строках, начинающихся на Bash
    sed '/^Bash/s/Bash/оболочка/g' firstfile.txt
  • Произвести замену только в строках, которые заканчиваются на Bash:
    sed '/команды/s/Bash/оболочка/g' firstfile.txt
  • Заменить слово с пробелом на слово с тире:
    sed 's/Bash\ /оболочка-/g' firstfile.txt
  • Заменить символ переноса строки на пробел
    sed 's/\n/ /g' firstfile.txt
  • Перенос строки обозначается символом — \n.

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

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

sed -i 's/команды/инструкции/' firstfile.txt

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

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

  • Удалить первую строку из файла:
    sed -i '1d' firstfile.txt
  • Удалить строку из файла, содержащую слово окне»:
    sed '/окне/d' firstfile.txt

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

  • Удалить пустые строки:
    sed '/^$/d' firstfile.txt
  • Убрать пробелы в конце строки:
    sed 's/ *$//' firstfile.txt
  • Табуляция удаляется при помощи конструкции:
    sed 's/\t*$//' firstfile.txt
  • Удалить последний символ в строке:
    sed 's/ ;$//' firstfile.txt

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

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

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

sed = firstfile.txt | sed 'N;s/\n/\t/'

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

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

sed 'y/1978/1977/g' firstfile.txt

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

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

sed '3s/директорий/папок' firstfile.txt

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

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

sed '3,4s/директорий/папок' firstfile.txt

Вставка содержимого файла после строки

Иногда требуется вставить содержимое одного файла (input_file.txt) после определенной строки другого (firstfile.txt). Для этой цели используется команда:sed ‘5r input_file.txt’ firstfile.txt (где 5r— 5 строка, input_file.txt— исходный файл и firstfile.txt— файл, в который требуется вставить массив текста).

11 ответов

Лучший ответ

(И если вы действительно хотите сделать это в sed, тогда: )

(И если вы действительно хотите сделать это в awk, тогда: )

140

lesmana
14 Ноя 2013 в 15:31

Попробуйте следующее:

38

kenorb
5 Май 2015 в 16:09

11

ghostdog74
23 Окт 2009 в 10:24

Попробуйте это:

Он удалит все пустые строки без каких-либо номеров. пробелов (пробелов или табуляции), т. е. (0 или более) в файле.

Примечание: внутри квадратной скобки стоит пробел, за которым следует «\ t».

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

2

Prabhat Kumar Singh
17 Окт 2014 в 11:49

Пример

Он дает в качестве вывода только строки, содержащие не менее 2 символов.

См. Также результаты с выходами

А также с выходами

1

CuberChase
10 Мар 2013 в 09:47

Для нескольких файлов (редактирование на месте):

Без изменения файла (просто распечатайте на стандартном выходе):

kenorb
5 Май 2015 в 16:10

Вот решение, которое удаляет все строки, которые либо пустые, либо содержат только символы пробела:

9

Adam Katz
11 Мар 2016 в 19:13

Perl может быть излишним, но он работает так же хорошо.

Удаляет все пустые строки:

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

Вариант, который редактирует оригинал и создает файл .bak:

Chris Koknat
13 Окт 2015 в 23:42

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

Запустите его на корневом уровне вашего проекта Xcode.

Если в вашем коде есть блоки комментариев, начинающиеся с и заканчивающиеся , например:

Тогда они будут включены в подсчет. (Слишком сложно).

Chrispy
22 Авг 2020 в 08:03

Самый простой ответ ——————————————

Deepak Shinde
9 Окт 2020 в 04:55

Удаляем файлы в Linux: практика

В ОС Linux для удаления файлов есть стандартная утилита rm. Как это принято со стандартными утилитами, в названии rm есть определённая идея. В нашем случае речь идёт о сокращении от английского слова Remove — удалять.

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

rm filename

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

rm /home/user/filename

Бывает, что файл защищён от записи. Тогда нам предложат подтвердить команду. Чтобы удалить файл в такой ситуации, просто вводим y и нажимаем Enter.

rm: remove write-protected regular empty file ‘filename’?

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

rm filename1 filename2 filename3

Ещё вариант — использование подстановочного знака * и регулярных выражений для соответствия определённым файлам. К примеру, мы легко удалим все файлы в Linux, имеющие расширение .txt следующей командой:

rm *.txt

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

rm -i filename(s)

Но когда файлов много, а вы твёрдо уверены в правильности своей команды и не хотите каждый раз отвечать на вопрос системы, используйте противоположную опцию -f. Будут удалены все файлы безоговорочно, т. е. без лишних вопросов:

rm -f filename(s)

Способ 2: Файловый менеджер

Файловый менеджер любой операционной системы (ОС) хорош тем, что он дает возможность наглядно отследить все проводимые манипуляции, в отличие от «Терминала» с его командной строкой. Однако есть и минусы. Один из них: нет возможности детально проследить за процессами, которые выполняются при той или иной операции.

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

Создаем файл в файловом менеджере

Необходимо делать следующее, чтобы создать файл:

  1. Открыть файловый менеджер (в данном случае Nautilus), нажав по его иконке на панели задач или проведя поиск по системе.

Перейти в необходимую директорию.
Нажать правой кнопкой мыши (ПКМ) по пустому месту.
В контекстном меню навести курсор на пункт «Создать документ» и выбрать необходимый вам формат (в данном случае формат один — «Пустой документ»).

После этого в директории появится пустой файл, которому остается лишь задать имя.

Как удалить файл в Linux с помощью настольного файлового менеджера

Любой, кто работает с Windows или macOS, найдет среду рабочего стола Linux очень знакомой. Обозреватель файлов в большинстве сред рабочего стола Linux, таких как Ubuntu GNOME или Mint’s Cinnamon, действительно облегчает управление файлами в Linux для среднего пользователя, который может быть не знаком с интерфейсами командной строки..

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

Откройте для себя лучшие приложения Linux 2020 года

Вы можете сделать это, щелкнув левой кнопкой мыши по файлу и нажав клавишу «Удалить» на клавиатуре. Это работает для групп файлов, которые вы выбрали их с помощью поля выбора или CTRL / SHIFT + щелчок левой кнопкой мыши. Кроме того, вы можете щелкнуть правой кнопкой мыши файл или один из выбранных вами файлов и выбрать «Переместить в корзину» из контекстного меню..

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

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

(Изображение предоставлено: Будущее)

В некоторых средах рабочего стола, таких как Mint’s Cinnamon, также есть возможность постоянного удаления файла прямо из контекстного меню, полностью обходя контейнер Trash..

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

(Изображение предоставлено: Будущее)

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

  • Это лучшие ноутбуки Linux на рынке прямо сейчас
  • Узнайте, какие из лучших дистрибутивов Linux 2020 года
  • Проверьте лучшие дистрибутивы Linux для конфиденциальности и безопасности в 2020 году

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

(Изображение предоставлено: Будущее)

Замена текста

Чаще всего sed используется для замены текста. Редактор позволяет осуществлять поиск текста по шаблону при помощи регулярных выражений. А затем заменять найденный текст. В простейшем варианте можно заменить одно слово на другое, используя следующий синтаксис:

's/старое_слово/новое_слово/'

Параметр «s» – это команда замены. Три слэша (/) нужны для разделения различных текстовых полей. Если вам удобно, вы можете использовать для этого другие символы. Например, если нам нужно изменить имя веб-сайта, удобнее использовать другой разделитель, так как URL содержат слэши. Воспользуемся командой echo для передачи примера:

echo "http://www.example.com/index.html" | sed 's_com/index_org/home_'
http://www.example.org/home.html

Здесь секция «com/index» заменяется на «org/home». В качестве разделителя используется нижнее подчеркивание «_». Не забудьте про последний разделитель, иначе sed выдаст ошибку.

echo "http://www.example.com/index.html" | sed 's_com/index_org/home'
sed: -e expression #1, char 22: unterminated `s' command

Создадим файл для отработки замен:

echo "this is the song that never ends
yes, it goes on and on, my friend
some people started singing it
not knowing what it was
and they'll continue singing it forever
just because..." > annoying.txt

Теперь заменим «on» на «forward»

sed 's/on/forward/' annoying.txt
this is the sforwardg that never ends
yes, it goes forward and on, my friend
some people started singing it
not knowing what it was
and they'll cforwardtinue singing it forever
just because...

Стоит обратить внимание на ряд моментов. Во-первых, мы заменяем шаблоны, а не слова

“on” в слове “song” было заменено на “forward”. Во-вторых, второе “on” в строке 2 заменено не было. Это произошло потому, что по умолчанию команда “s” обрабатывает первое совпадение в строке. А затем переходит к следующей строке. Для замены каждого “on”, а не только первого в строке, можно указать команде замены флаг “g” после шаблонов:

sed 's/on/forward/g' annoying.txt
this is the sforwardg that never ends
yes, it goes forward and forward, my friend
some people started singing it
not knowing what it was
and they'll cforwardtinue singing it forever
just because...

Теперь были заменены все “on”. Чтобы заменить только вторые “on” в каждой строке, вместо “g” нужно указать “2”:

sed 's/on/forward/2' annoying.txt
this is the song that never ends
yes, it goes on and forward, my friend
some people started singing it
not knowing what it was
and they'll continue singing it forever
just because...

Если нам нужно вывести только те строки, где выполнялась замена, для отмены автоматического вывода можно снова воспользоваться опцией «-n». Затем мы можем передать флаг “p” для вывода строк, в которых производились замены.

sed -n 's/on/forward/2p' annoying.text
yes, it goes on and forward, my friend

Пример показывает, что флаги в конце команды можно комбинировать. Чтобы игнорировать регистр, нужно указать флаг “i”.

sed 's/SINGING/saying/i' annoying.txt
this is the song that never ends
yes, it goes on and on, my friend
some people started saying it
not knowing what it was
and they'll continue saying it forever
just because...

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

grep 'текс' -P -R -I -l  * | xargs sed -i 's/текст_который_нужно_искать/текст/g'

Про утилиту grep можно прочитать здесь

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

https://youtube.com/watch?v=_gICtfiSulU

Как удалить пустые / пустые (включая только пробелы) строки в файле в Unix / Linux с помощью командной строки?

содержимое file.txt

желаемый результат

  • Для awk см .: Удаление пустых строк в awk или использование grep, в общем, см .: Как удалить пустые строки из файла в оболочке?
  • тот же вопрос и тот же ответ, что и здесь, но с гораздо большим количеством голосов
  • Это эпический ответ, который дает практически все возможные решения с использованием grep, sed, awk: stackoverflow.com/questions/16414410/…

Эта строка sed должна помочь:

В означает, что он будет редактировать файл на месте.

  • 18 На самом деле это должно быть «/ ^ * $ / d», чтобы удалить строки, содержащие только пробелы.
  • 3 @SeanReifschneider Этого требования не было в вопросе, когда был написан этот ответ?
  • 6 @SeanReifschneider Не лучше ли «/ ^ \ s * $ / d» включать вкладки? Хотя это не упоминается в исходном сообщении, мне кажется, что это более сильный вариант.
  • 1 добавление то же решение, что и вопрос stackoverflow
  • я получил

Простое решение — использовать (GNU или BSD), как показано ниже.

  • Удалите пустые строки (кроме строк с пробелами).

  • Удалите полностью пустые строки (включая строки с пробелами).

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

Похож на (подходит для файлов гораздо большего размера).

Удалите пустые строки, исключая строки с пробелами:

или включая строки с пробелами:

  • 4 кажется самым простым решением.
  • Обратной стороной по сравнению с другими решениями заключается в том, что он выделяет весь текст красным цветом. Остальные решения позволяют сохранить оригинальные цвета. Сравнить к
  • 2 @wisbucky Вы видите цвета, потому что псевдоним в вашей системе (проверьте: ). Вы можете запустить его как или используйте параметр.
  • @kenorb Если вы используете , вы получите весь белый текст, который переопределяет цветовое форматирование исходной команды (пример: )
  • будет соответствовать строкам, содержащим только пробелы, что, по словам OP, нежелательно.

d — команда sed для удаления строки. — это регулярное выражение, соответствующее только пустой строке, за началом строки следует конец строки.

  • 1 +1 за объяснение
  • Эта команда не дает такой же результат, как запрошенный OP (она выдает 5 строк, а не 4).

Вы можете использовать опцию -v с grep, чтобы удалить соответствующие пустые строки.

Как это

  • 4 Я не верю, что вам нужен , по крайней мере, не с помощью GNU grep, но в остальном мне так приятно видеть, что это сделано с помощью grep! Я предпочитаю sed каждый раз; встроенные фильтры мне кажутся лучше встроенных редакторов.
  • Если вы хотите пропустить закомментированные и пустые строки, особенно при работе с файлами conf, используйте
  • требует -E, если вы используете команду @GovindKailas

Вот решение:

С Awk, только для непустых строк. Когда это условие совпадает, действие Awk по умолчанию — распечатать всю строку.

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

Это дает 6 строк, а не 4, как запрашивал OP.

Ex / Vim

Вот метод, использующий редактор (часть Vim):

Для нескольких файлов (редактирование на месте):

Обратите внимание команда не POSIX. Без изменения файла (просто распечатайте на стандартном выходе):

Без изменения файла (просто распечатайте на стандартном выходе):

xargs, если вы не возражаете удалить ведущие пробелы

Для меня команда @ martigin-heemels выдавала ошибку, которая исправила ее (т.е. фиктивный параметр для i),

Tweet
Share
Link
Plus
Send
Send
Pin

15 ответов

Лучший ответ

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

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

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

691

Kent
27 Ноя 2018 в 11:46

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

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

Примере:

Выходы

34

Vadim
17 Окт 2014 в 03:26

Awk

62

wisbucky
25 Апр 2019 в 22:37

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

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

65

Community
23 Май 2017 в 12:10

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

Что вернется:

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

131

fedorqui ‘SO stop harming’
30 Ноя 2015 в 11:11

Для меня с FreeBSD 10.1 с sed работало только это решение:

Внутри есть символы пробела и табуляции.

Тестовый файл содержит:

-3

fedorqui ‘SO stop harming’
16 Авг 2017 в 14:44

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

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

-1

Samuel Kenneth
8 Май 2021 в 16:45

Использование редактора vim для удаления пустых строк

-1

Nilesh Shukla
9 Апр 2021 в 03:36

Мой ответ для — рекомендовать использовать для этого оператор подстановки с флагом глобального шаблона , как показано ниже:

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

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

justincbagley
24 Июл 2018 в 22:20

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

2

Claes Wikner
25 Авг 2016 в 11:03

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

2

Lowbit
11 Авг 2014 в 17:20

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

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

4

Benjamin W.
10 Авг 2018 в 13:53

Ты можешь сказать:

5

fedorqui ‘SO stop harming’
2 Апр 2015 в 12:50

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

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

10

user319660
2 Май 2020 в 12:17

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

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

15

Community
23 Май 2017 в 11:54

1) Заменить все строчные буквы на заглавные

Мы можем использовать tr для преобразования нижнего регистра в верхний или наоборот.

Просто используем наборы или для замены всех символов.

Вот пример, как преобразовать в Linux с помощью команды tr все строчные буквы в заглавные:

$ echo "hello linux world" | tr   
HELLO LINUX WORLD

А сейчас сделаем замену из файла input.txt

$ cat input.txt
hi this is text

$ tr "a-z" "A-Z" < input.txt
HI THIS IS TEXT

$ cat input.txt
hi this is text

Как мы видим, в файле ничего не изменилось, осталось все строчными буквами. Чтобы изменения были в файле, на необходимо перевести вывод в новый файл. Например, в output.txt

$ tr "a-z" "A-Z" < input.txt > output.txt

$ cat output.txt
HI THIS IS TEXT

Кстати, в команде sed есть опция y которая делает то же самое (sed ‘y/SET1/SET2’)

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

Для выполнения операций сопоставления 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», если условие выполняется.

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

  1. Чтобы сравнить две строки, нужно написать bash-скрипт с именем test.
  2. Далее необходимо открыть терминал и запустить test на выполнение командой:
    ./test
  3. Предварительно необходимо дать файлу право на исполнение командой:
    chmod +x test
  4. После указания пароля скрипт выдаст сообщение на введение первого и второго слова. Затем требуется нажать клавишу «Enter» для получения результата сравнения.

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

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

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

— это в основном строка символов, включая специальные символы с обратным слэшем.

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

Каждое вхождение заменяется на , на и на :

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

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

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

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

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

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

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

Символ не удаляется, потому что входные данные включают в верхнем регистре, а символ в SET — в нижнем регистре.

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

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

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

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

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

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

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

Вы можете видеть, что последние три символа SET1 удалены. SET1 становится ‘ab’ той же длины, что и SET2, и замены не производится.

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

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

How to Remove Files and Directories Using Linux Command Line

21 Июня 2020
&vert;

Терминал

Как удалить файлы 

Чтобы удалить (или удалить) файл в Linux из командной строки, используйте команду  (удалить) или  команду.

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

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

  • Чтобы удалить один файл, используйте команду  or,  а затем имя файла:

    Если файл защищен от записи, вам будет предложено подтвердить, как показано ниже. Чтобы удалить тип файла  и нажмите  . В противном случае, если файл не защищен от записи, он будет удален без запроса.

  • Чтобы удалить несколько файлов одновременно, используйте  команду, за которой следуют имена файлов, разделенные пробелом.

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

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

  • Используйте опцию  with  для подтверждения каждого файла перед его удалением:

  • Чтобы удалить файлы без запроса, даже если файлы защищены от записи, передайте параметр  (force)  команде:

  • Вы также можете комбинировать  варианты. Например, чтобы удалить все  файлы в текущем каталоге без запроса в подробном режиме, используйте следующую команду:

В Linux вы можете удалять / удалять каталоги с помощью  и  .

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

  • Чтобы удалить пустой каталог, используйте либо имя,  либо  имя каталога:

  • Чтобы удалить непустые каталоги и все файлы в них, используйте  команду с параметром  (рекурсивный):

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

  • Чтобы удалить непустые каталоги и все файлы без запроса, используйте  с  (recursive) и  параметрами:

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

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

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

Диапазоны адресов

Рассмотренные выше примеры вряд ли можно назвать редактированием (если мы не хотели выводить каждую строку два раза). Давайте изменим результат, указав sed напечатать только первую строку.

sed -n '1p' BSD
Copyright (c) The Regents of the University of California.

Число «1» перед командой вывода указывает номер строки для работы. Таким же образом мы можем вывести пять строк (не забываем про «-n»).

sed -n '1,5p' BSD
Copyright (c) The Regents of the University of California. 
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions

Мы только что передали в утилиту адрес. При получении адреса редактор выполняет указанные далее команды только над этими строками. В данном примере мы указали начальный адрес и смещение, чтобы сообщить команде, сколько ещё строк она должна пройти:

sed -n '1,+4p' BSD

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

Если нужно исключить какие-то строки, можно указать интервал после символа «~».
Следующая команда напечатает все нечетные строки, начиная с первой:

sed -n '1~2p' BSD
Copyright (c) The Regents of the University of California.
modification, are permitted provided that the following conditions
1. Redistributions of source code must retain the above copyright
2. Redistributions in binary form must reproduce the above copyright
documentation and/or other materials provided with the distribution.
may be used to endorse or promote products derived from this software
. . .
. . .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

8 ответов

Лучший ответ

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

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

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

95

Jonathan Wakely
28 Янв 2013 в 20:42

Вы можете использовать параметр sed для редактирования на месте без использования временного файла:

2

P.P
28 Янв 2013 в 20:24

Чтобы быть внимательным и удалить строки даже , если они включают пробелы или табуляции, что-то вроде этого в perl сделает это:

Конечно, есть эквиваленты awk и sed. Лучше не предполагать, что строки полностью пусты, как это сделал бы .

Ура

3

G. Cito
28 Янв 2013 в 20:32

С awk

7

Mirage
29 Янв 2013 в 01:13

Grep просматривает ваш файл построчно; точка соответствует чему угодно кроме символа новой строки. Таким образом, вывод grep — это все строки, состоящие из чего-то, кроме одной новой строки.

8

jscs
27 Мар 2013 в 18:49

Удаляет все строки, состоящие только из пробелов (или полностью пустые). Вы можете изменить пустое поле на , где — это представление для вкладки. Будет ли расширение выполнять ваша оболочка или , но вы, вероятно, можете ввести символ табуляции напрямую. А если вы используете GNU или BSD , вы можете редактировать на месте, если хотите, с помощью опции .

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

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

Другая возможность заключается в том, что ваш файл данных поступил из Windows и имеет окончания строки CRLF. Unix видит возврат каретки в конце строки; это не пробел, поэтому строка не удаляется. Есть несколько способов справиться с этим. Надежный — удалить () восьмеричный код символа 15, также известный как Ctrl-M или или возврат каретки:

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

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

Вы можете попробовать именованные классы символов POSIX, такие как ; возможно, это сработает, но не гарантируется. Вы можете попробовать:

Если это сработает, между «Hello» и «World» будет три пробела. В противном случае вы, вероятно, получите сообщение об ошибке от . Это может избавить вас от горя по поводу ввода вкладок в командной строке.

12

Jonathan Leffler
25 Мар 2014 в 13:55

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

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

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

17

gpojd
28 Янв 2013 в 20:35

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

42

Jotne
20 Ноя 2014 в 10:09

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: