Перейти до змісту

sed - пошук і заміна

sed — це команда, що розшифровується як «редактор потоку»

Умовності

  • path: фактичний шлях. Приклад: /var/www/html/
  • filename: фактичне ім'я файлу. Приклад: index.php

Використання sed

Використання sed для пошуку та заміни є моїм особистим уподобанням, оскільки ви можете використовувати розділювач на свій вибір, що робить заміну таких речей, як веб-посилання, на «/» в них дуже зручними. Приклади за умовчанням для редагування на місці за допомогою sed показують такі речі, як цей приклад:

sed -i 's/search_for/replace_with/g' /path/filename

Але що, якщо ви шукаєте рядки, які містять "/" в них? Якщо скісна риска була єдиним доступним варіантом роздільника? Перш ніж використовувати її під час пошуку, вам потрібно буде відмінити кожну косу риску. Саме в цьому sed перевершує інші інструменти, оскільки роздільник можна змінювати на льоту (не потрібно вказувати, що ви його десь змінюєте). Як було сказано, якщо ви шукаєте щось, що містить "/", ви можете зробити це, змінивши роздільник на "|". Ось приклад пошуку посилання за допомогою цього методу:

sed -i 's|search_for/with_slash|replace_string|g' /path/filename

Ви можете використовувати будь-який однобайтовий символ як роздільник, за винятком зворотної косої риски, нового рядка та "s". Наприклад, це також працює:

sed -i 'sasearch_forawith_slashareplace_stringag' /path/filename, де "a" є роздільником, а пошук і заміна все ще працюють. З міркувань безпеки ви можете вказати резервну копію під час пошуку та заміни, що зручно, щоб переконатися, що зміни, які ви робите за допомогою sed, відповідають вашим справжнім бажанням. Це дає вам можливість відновлення з файлу резервної копії:

sed -i.bak s|search_for|replacea_with|g /path/filename

Це створить невідредаговану версію filename під назвою filename.bak

Ви також можете використовувати повні лапки замість одинарних:

sed -i "s|search_for/with_slash|replace_string|g" /path/filename

Пояснення параметрів

Опція Пояснення
i редагує файл на місці
i.ext створити резервну копію з будь-яким розширенням (ext тут)
s визначає пошук
g вказує на глобальну заміну, іншими словами, усі випадки

Кілька файлів

На жаль, sed не має опції вбудованого циклу, як perl. Щоб прокрутити кілька файлів, вам потрібно об’єднати команду sed у сценарій. Ось приклад того, як це зробити.

Спочатку створіть список файлів, які використовуватиме ваш сценарій. Зробіть це в командному рядку за допомогою:

find /var/www/html -name "*.php" > phpfiles.txt

Далі створіть сценарій для використання цього phpfiles.txt:

#!/bin/bash

for file in `cat phpfiles.txt`
do
        sed -i.bak 's|search_for/with_slash|replace_string|g' $file
done

Сценарій переглядає всі файли, створені в phpfiles.txt, створює резервну копію кожного файлу та виконує пошук і заміну рядка глобально. Коли ви переконаєтеся, що зміни відповідають вашим вимогам, ви можете видалити всі файли резервної копії.

Інше документи та приклади

Висновок

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

Author: Steven Spencer