У деяких випадках нам потрібно видалити певний рядок з файлу або декількох, наприклад, зі мною траплялося, що у мене був цілий список файлів, і мені потрібно видалити рядок №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 😉
привіт
Дуже хороший внесок 😉
Дякую
До речі, ми отримали ваш електронний лист прямо зараз, я відповім вам 😀
привіт
Як первосвященик терміналу, серверів та з'єднань ssh, я приходжу до вас, о, чудовий KZKG ^ Гаара, і я прошу вас: де я можу отримати підручник на рівні свого незнання, який дозволяє мені використовувати ssh-з'єднання між двома віддаленими машинами в різних мережах для спільного використання текстові файли, pdf, зображення та звук (mp3)….
🙂
Серйозно, не могли б ви мене проконсультувати з цього приводу, у мене є дві машини, одна на роботі і одна вдома, і мені потрібен ssh-зв’язок між ними (адже, як я розумію, ssh дозволяє обмінюватися вмістом між машинами, я прав?)
І якщо я помиляюся, яку програму ви рекомендуєте?
І де я можу знайти базовий підручник з цього приводу?
scp
scp user @ machine_address: path user @ machine_address: path.
Той же синтаксис, що і cp, source -> destination.
Ти з'явився, людина, ти загубився.
Гарна порада!
Цікава порада ... xD
Ви випадково знаєте такий, який виділяє жирний текст?
Я маю на увазі, у мене є файл txt, який є словником, він має понад 10000 XNUMX рядків, і я хочу, щоб він виділив певний текст перед пунктами підвіски ":", і робити це по одному занадто багато.
Привіт
Текстовий файл - це звичайний текст, як випливає з назви ... звичайний, без форматів або чогось подібного, вибачте, але я думаю, що те, що ви запитуєте, не можна зробити, чи не так? 🙁
привіт
насправді це можливо, але ви повинні знати формат призначення.
пе:
echo $ (echo "Роберт: Привіт. Зміни тут" | sed 's / \ ./. \\ e [40; 31m /; s / \: /: \\ e [40; 35m /')
це справа впоратися.
інший спосіб видалення, який можна використовувати, - sed '/' $ 1 '/ d', але ви повинні бути впевнені в повторності.
потім завершіть збереження в * .odt
Чи немає простішого способу зробити це за допомогою LibreOffice?
Чи можете ви видалити частину рядка, а решту залишити?
Скажімо, я хочу видалити все перед словом у певному рядку.
Або видаліть усе, що йде після цього слова.
Так, справа в тому, щоб витягнути регулярний вираз (якщо потрібно 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. * //'
Дякую, це мені дуже корисно.
Приємна стаття, яка мені подобається, який чудовий SysAdmin!
Яким було б наше життя без sed, awek, perl, grep, хвоста, голови, "Emacs" та багатьох інших важливих інструментів!?
Дякую, це було дуже корисно.
Привіт, і як ти міг видалити рядки 1,4 та 10 із файлу за допомогою тієї самої команди?