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
сторінка посібникаsed
додаткові прикладиsed
&awk
Книга O'Reilly
Висновок¶
sed
є потужним інструментом, який дуже добре працює для функцій пошуку та заміни, особливо там, де роздільник має бути гнучким.
Author: Steven Spencer