sed - пошук і заміна¶
sed — це команда, що розшифровується як «редактор потоку»
Умовності¶
- path
: Фактичний шлях. Приклад:/var/www/html/` ім'я_файлу: Фактична назва файлу. Приклад: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' /шлях/ім'я_файлу, де "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сторінка посібникаsedдодаткові прикладиsed&awkКнига O'Reilly
Висновок¶
sed є потужним інструментом, який дуже добре працює для функцій пошуку та заміни, особливо там, де роздільник має бути гнучким.
Author: Steven Spencer