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

В определенных случаях нам нужно удалить определенную строку из файла или нескольких, например, со мной случилось, что у меня был целый список файлов, и мне нужно удалить строку № 27 из всех них (строка № 27 - это то, что ACL, нормы, правила, конфигурации), я могу либо редактировать файл за файлом, либо просто достичь того, что мне нужно, с помощью команды СЕПГ и сценарий bash (необязательно).

Но давайте попробуем один файл несколько проще.

У нас есть файл distros-deb.txt который содержит это:

Debian

Kubuntu

Archlinux

Soluses

мята

Другими словами, файл distros-deb.txt - это то, в которое мы поместим дистрибутивы на основе Debian, но там мы видим, что в строке №3 находится «archlinux», дистрибутив, который явно не имеет ничего общего с Debian, поэтому мы должны исключить эту строку. Чтобы исключить строку № 3 этого файла, мы поместим следующее:

sed "3d" distros-deb.txt > distros-deb-ok.txt

Объяснить эту строку довольно просто, используя жаждущий "3d" мы указываем, что удалим строку №3 с distros-deb.txt Мы указываем, с каким файлом работать, то есть удаляем строку №3 этого файла, и до этого момента, если мы нажмем Enter, она покажет нам, что мы хотим, но в терминале, поэтому с > дистрибутив-деб-ок.txt мы указываем, что вместо отображения результата в терминале он помещает его в файл с этим именем.

Что просто?

Кроме того, мы можем избежать использования > дистрибутив-деб-ок.txt используя правильный параметр СЕПГ, параметр -i

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

sed -i "3d" distros-deb.txt

Это удалит строку №3 из distros-deb.txt и сохранит ее.

Что, если мне нужен диапазон строк, то есть удалить строку №3, но также строки №4 и №5? Для этого мы ставим диапазон от 3 до 5, то есть:

sed -i "3,5d" distros-deb.txt

И он покажет мне только debian и kubuntu 😀

Так что, если я хочу удалить строку со 2 до последней, когда я не знаю всего строк?

Просто используйте символ доллара - »$

sed -i "2,$d" distros-deb.txt

В случае, если вы хотите исключить из первой строки до # 4, мы просто помещаем значение 1 в начало:

sed -i "1,4d" distros-deb.txt

Это было все, очень полезный совет, когда вы хотите создавать сценарии bash для автоматизации задач, и вам нужно изменить и удалить строки файлов конфигурации, чтобы изменить, мы можем использовать СЕПГ o Perl, а также для устранения мы уже знаем, как это сделать с помощью sed 😉

привет


Содержание статьи соответствует нашим принципам редакционная этика. Чтобы сообщить об ошибке, нажмите здесь.

16 комментариев, оставьте свой

Оставьте свой комментарий

Ваш электронный адрес не будет опубликован. Обязательные для заполнения поля помечены *

*

*

  1. Ответственный за данные: Мигель Анхель Гатон
  2. Назначение данных: контроль спама, управление комментариями.
  3. Легитимация: ваше согласие
  4. Передача данных: данные не будут переданы третьим лицам, кроме как по закону.
  5. Хранение данных: база данных, размещенная в Occentus Networks (ЕС)
  6. Права: в любое время вы можете ограничить, восстановить и удалить свою информацию.

  1.   mss-devel сказал

    Очень хороший вклад 😉

    1.    КЗКГ ^ Гаара сказал

      Благодарю вас!

      Кстати, мы получили ваше письмо прямо сейчас, я вам отвечу 😀

      привет

  2.   безымянный сказал

    Как верховный жрец терминала, серверов и ssh-соединений, я прихожу к вам, о, великий KZKG ^ Gaara, и я спрашиваю вас: где я могу получить руководство на уровне моего невежества, которое позволяет мне использовать ssh-соединения между двумя удаленными машинами в разных сетях для обмена текстовые файлы, pdf, изображения и звук (mp3)….

    ????

    Серьезно, не могли бы вы посоветовать мне в этом отношении, у меня две машины, одна на работе, а другая дома, и мне нужно соединение по ssh между ними (потому что, как я понимаю, ssh позволяет передавать контент между машинами, я прав? ).
    И если я ошибаюсь, какое приложение посоветуете?
    И где я могу найти базовое руководство по этому поводу?

    1.    -спайкер- сказал

      scp.

      scp user @ machine_address: путь user @ machine_address: путь.

      Тот же синтаксис, что и cp, источник -> место назначения.

  3.   F3niX сказал

    Ты появился, чувак, ты заблудился.

  4.   Хоакин сказал

    Хороший совет!

  5.   LycusHackerЭмо сказал

    Интересный совет… xD

    случайно вы не знаете тот, который выделяет жирный текст?
    Я имею в виду, у меня есть текстовый файл, который представляет собой словарь, в нем более 10000 XNUMX строк, и я хочу, чтобы он выделял определенный текст перед точками приостановки ":", и делать это по одной - слишком много.

    1.    КЗКГ ^ Гаара сказал

      Привет,

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

      привет

      1.    аса сказал

        на самом деле может, но вам нужно знать формат назначения.
        ре:
        echo $ (echo "Роберт: Здравствуйте. Поменяйте здесь" | sed 's / \ ./. \\ e [40; 31m /; s / \: /: \\ e [40; 35m /')
        это вопрос совладания.
        другой способ удаления, который можно использовать, - это sed '/' $ 1 '/ d', но вы должны быть уверены в этом.

        1.    LycusHackerЭмо сказал

          затем завершите сохранение в * .odt

          Нет более простого способа сделать это с помощью LibreOffice?

  6.   Лоло сказал

    Не могли бы вы удалить часть строки и оставить остальную?

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

    Или удалите все, что следует за этим словом.

    1.    аса сказал

      Да, это вопрос извлечения регулярного выражения (при необходимости man sed -r, –regexp-extended)
      Начиная с того, что я нахожу
      echo «Роберт: Привет. Изменить здесь »| sed 's / Изменить //'
      с четко выраженным рисунком и с. (один символ) и * (более одного)
      то:
      echo «Роберт: Привет. Изменить здесь »| sed 's / Изменить. * //'
      раньше:
      echo «Роберт: Привет. Изменить здесь »| sed 's /. * Изменить //'
      Если важно, что слово появляется
      echo «Роберт: Привет. Изменить здесь »| sed 's / Изменить. * / Изменить /'
      или более сложный
      в строке, содержащей Роберта, что следует после Change
      echo -e «Фриц: Привет. Поменяйте здесь \ nРоберт: Привет. Изменить здесь »| sed '/Robert/s/Cambio.*//'
      или как в начале вынимаем вторую строку и обрабатываем остальные
      echo -e «Фриц: Привет. Поменяйте здесь \ nРоберт: Привет. Поменяйте здесь \ nДругое »| sed -e 2d -e 's / Изменить. * //'
      echo -e «Фриц: Привет. Поменяйте здесь \ nРоберт: Привет. Поменяйте здесь \ nДругое »| sed '2d; s / Изменить. * //'

      1.    Лоло сказал

        Спасибо, мне это очень пригодилось.

  7.   MSX сказал

    Хорошая статья, те, которые мне нравятся, как замечательный Системный администратор!
    Какой была бы наша жизнь без sed, awek, perl, grep, tail, head, Emacs и многих других необходимых инструментов !?

  8.   Лисбет Олларвес сказал

    Спасибо, очень помогли.

  9.   Перни сказал

    Здравствуйте, а как вы могли удалить из файла строки 1,4 и 10 в одной команде?