Як видалити певні рядки з файлу за допомогою sed

У деяких випадках нам потрібно видалити певний рядок з файлу або декількох, наприклад, зі мною траплялося, що у мене був цілий список файлів, і мені потрібно видалити рядок №27 з усіх цих (рядок # 27 - це список ACL , норма, правило, конфігурація), я можу або редагувати файл за файлом, або я можу просто досягти того, що мені потрібно, використовуючи команду sed та скрипт bash (необов’язково).

Але спробуємо один файл дещо простіший.

У нас є файл distros-deb.txt який містить це:

Debian

kubuntu

Арклінукс

розчини

м'ята

Тобто файл distros-deb.txt в якому ми помістимо дистрибутиви на основі Debian, але там ми бачимо, що в рядку №3 є "archlinux", дистрибутив, який, очевидно, не має нічого спільного з Debian, тому ми повинні усунути цей рядок. Щоб виключити рядок №3 цього файлу, ми помістимо наступне:

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

Пояснити цей рядок дещо просто, с спраглий "3d" ми вказуємо, що ми видалимо рядок №3, з distros-deb.txt Ми вказуємо, над яким файлом працювати, тобто видаляємо рядок №3 цього файлу, аж до цього, якщо ми натиснемо Enter, він покаже нам, що ми хочемо, але в терміналі, так що з > distros-deb-ok.txt ми вказуємо, що замість показу результату в терміналі, щоб помістити його у файл з таким ім’ям.

Що просто?

Крім того, ми можемо уникнути використання > distros-deb-ok.txt використовуючи належний параметр sed, параметр -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 для автоматизації завдань, і вам потрібно змінити та усунути рядки конфігураційних файлів, щоб змінити, ми можемо використовувати sed o Perl, а також для усунення ми вже знаємо, як це зробити за допомогою sed 😉

привіт


Залиште свій коментар

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

*

*

  1. Відповідальний за дані: Мігель Анхель Гатон
  2. Призначення даних: Контроль спаму, управління коментарями.
  3. Легітимація: Ваша згода
  4. Передача даних: Дані не передаватимуться третім особам, за винятком юридичних зобов’язань.
  5. Зберігання даних: База даних, розміщена в мережі Occentus Networks (ЄС)
  6. Права: Ви можете будь-коли обмежити, відновити та видалити свою інформацію.

  1.   mss-devel - сказав він

    Дуже хороший внесок 😉

    1.    KZKG ^ Гаара - сказав він

      Дякую

      До речі, ми отримали ваш електронний лист прямо зараз, я відповім вам 😀

      привіт

  2.   безіменний - сказав він

    Як первосвященик терміналу, серверів та з'єднань ssh, я приходжу до вас, о, чудовий KZKG ^ Гаара, і я прошу вас: де я можу отримати підручник на рівні свого незнання, який дозволяє мені використовувати ssh-з'єднання між двома віддаленими машинами в різних мережах для спільного використання текстові файли, pdf, зображення та звук (mp3)….

    🙂

    Серйозно, не могли б ви мене проконсультувати з цього приводу, у мене є дві машини, одна на роботі і одна вдома, і мені потрібен ssh-зв’язок між ними (адже, як я розумію, ssh дозволяє обмінюватися вмістом між машинами, я прав?)
    І якщо я помиляюся, яку програму ви рекомендуєте?
    І де я можу знайти базовий підручник з цього приводу?

    1.    -спікер- - сказав він

      scp

      scp user @ machine_address: path user @ machine_address: path.

      Той же синтаксис, що і cp, source -> destination.

  3.   f3niX - сказав він

    Ти з'явився, людина, ти загубився.

  4.   Хоакін - сказав він

    Гарна порада!

  5.   LycusHackerEmo - сказав він

    Цікава порада ... xD

    Ви випадково знаєте такий, який виділяє жирний текст?
    Я маю на увазі, у мене є файл txt, який є словником, він має понад 10000 XNUMX рядків, і я хочу, щоб він виділив певний текст перед пунктами підвіски ":", і робити це по одному занадто багато.

    1.    KZKG ^ Гаара - сказав він

      Привіт

      Текстовий файл - це звичайний текст, як випливає з назви ... звичайний, без форматів або чогось подібного, вибачте, але я думаю, що те, що ви запитуєте, не можна зробити, чи не так? 🙁

      привіт

      1.    ака - сказав він

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

        1.    LycusHackerEmo - сказав він

          потім завершіть збереження в * .odt

          Чи немає простішого способу зробити це за допомогою LibreOffice?

  6.   Лоло - сказав він

    Чи можете ви видалити частину рядка, а решту залишити?

    Скажімо, я хочу видалити все перед словом у певному рядку.

    Або видаліть усе, що йде після цього слова.

    1.    ака - сказав він

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

      1.    Лоло - сказав він

        Дякую, це мені дуже корисно.

  7.   MSX - сказав він

    Приємна стаття, яка мені подобається, який чудовий SysAdmin!
    Яким було б наше життя без sed, awek, perl, grep, хвоста, голови, "Emacs" та багатьох інших важливих інструментів!?

  8.   Лісбет Олларвес - сказав він

    Дякую, це було дуже корисно.

  9.   Перні - сказав він

    Привіт, і як ти міг видалити рядки 1,4 та 10 із файлу за допомогою тієї самої команди?