Команди Linux і навички оболонки
sed: редагування потоків без відкриття редактора
sed редагує збоку: через нього проходять цілі потоки тексту, виходять трансформованими, і редактор не відкривається. Його репутація походить від -i, який перетворює заміну одного рядка на пакетну операцію з тисячами файлів, і від історій про катастрофи адміністраторів, які запускали його без суфікса резервного копіювання. Безпечний робочий процес ніколи не змінюється: запустіть заміну видимою, підтвердьте вихід, потім додайте -i з суфіксом і збережіть код виходу.
Головне
- Попередній перегляд перед фіксацією: файл sed -n '10,20p' показує діапазон рядків, а та сама комбінація -n плюс p друкує лише ті рядки, які відповідають регулярному виразу чи адресі.
- Замініть прапорцями, які виконують те, що ви маєте на увазі: s/old/new/g для всіх збігів, число на кшталт 2g лише для другого та -E для розширеного регулярного виразу без сторінок екранування зворотної косої риски.
- Редагування на місці отримують суфікс, без винятків: програма sed -i.bak 's/http:/https:/g' зберігає резервну копію з тим самим іменем біля кожної зміни; цей суфікс врятував більше розгортань, ніж історія скасувань будь-якого редактора.
- Розділювачі вільні: s|/var/www|/srv/app|g (або s#...#g) уникає конфліктів, коли ваш шаблон повний шляхів.
- -i не є атомарним: збій або неправильний регулярний вираз у середині пакету одного разу залишив наполовину переписані файли, тому групові завдання виконуються з копіями чи деревами, що відстежуються git, ніколи з єдиною копією.
- GNU і BSD sed розходяться щодо -i: BSD вимагає суфікс перед сценарієм (sed -i '' працює в macOS, не є синтаксисом Linux), що є ще однією причиною, чому сценарії переносимості повністю уникають -i.
- Видалити та ізолювати є чесними дієсловами: 'd' видаляє відповідні рядки (sed '/^#/d' видаляє коментарі), а -n із діапазоном ізолює розділ; обидва читаються краще, ніж розумні заміни.
- Усе, що минуло від однорядкових редагувань, літеральних багаторядкових блоків або об’єднань із збереженням стану, належить до awk або справжнього сценарію; змушуючи sed виконувати роботу програміста, ось як народжуються нечитабельні однорядкові тексти.
Польова нотатка
Мій перший sed -i без суфікса .bak потрапив у робочу конфігурацію nginx безпосередньо перед денним піком трафіку. Відтоді кожне редагування на місці має суфікс резервного копіювання, і я читаю висновок сухого запуску до того, як -i навіть з’явиться біля команди.
Часті запитання
Як редагувати лише ті рядки, які збігаються з чимось іншим?
Вирішіть їх: sed '/cache/s/true/false/' перетворює true на false лише в рядках кешу, а діапазони, як-от '/<VirtualHost>/,/<\/VirtualHost>/s/Old/New/g', змінюють область редагування до блоків; перша йде адреса, а друга – команда.
Чому sed не збігається з кінцями рядків у файлі, редагованому Windows?
Ці рядки закінчуються символами повернення каретки, яких прив’язки «$» не очікують; спочатку видаліть їх за допомогою tr або нормалізуйте по дорозі, і багаторядковий вміст усе ще належить до awk або Perl з -0777.
Чи sed швидший за awk для простих замін?
Маргінально і нерелевантно; обидва завершуються за мілісекунди на файлах розміром конфігурації. Вибирайте по читабельності, адже колега за півроку має розібрати ваш одностроковий текст.
Чи можу я вставити цілі блоки конфігурації за допомогою sed?
Так: 'a' додає після, 'i' вставляє перед, а 'c' замінює рядок, але вставлений текст повинен бути простим і одноцільовим; справжні блоки належать до файлу шаблону або належного етапу підготовки.
Допомога Kinetikatech: команди linux і навички оболонки
Ми бралися за це сотні разів: Команди та сценарії, які вирішують, чи керує адміністратор сервером, чи бореться з ним: шукайте, трансформуйте, пересилайте та контролюйте текст і процеси за допомогою інструментів, які присутні в кожній базовій установці. Служба Безпека серверів Linux та Адміністрування серверів дає замкнений цикл: ми оцінюємо, впроваджуємо, цілодобово стежимо й підхоплюємо за 30 хвилин, коли це критично.