Командата sed в Linux: Пълно ръководство
Практическо ръководство за sed в Linux: замяна, изтриване, филтриране, работа с редове, регулярни изрази и промяна на файлове.
Предварителни изисквания
- Основни познания по Linux terminal
Командата sed в Linux: Пълно ръководство
В Linux има инструменти, които изглеждат елементарни, но с времето се превръщат в неизменна част от ежедневната работа. sed е точно такъв инструмент.
Името идва от stream editor – редактор на текстови потоци. За разлика от интерактивен редактор като nano или vim, sed обработва текста автоматично според зададени правила. Това го прави особено полезен при работа с конфигурационни файлове, Bash scripts, log files и автоматизирани DevOps задачи.
Най-често sed се използва за:
- замяна на текст;
- изтриване на редове;
- извличане на определени редове;
- промяна на конфигурационни файлове;
- работа с регулярни изрази;
- автоматизирана обработка на множество файлове;
- използване в pipelines.
1. Основен синтаксис
Най-простият синтаксис е:
sed 'команда' файл
Например:
sed 's/Linux/linux/' text.txt
Тук:
sозначава substitute;Linuxе текстът, който търсим;linuxе новият текст;text.txtе входният файл.
По подразбиране резултатът се извежда на stdout, а оригиналният файл не се променя.
Това е важен принцип при работа със sed: първо можеш да видиш резултата, без да рискуваш да промениш файла.
2. Най-използваната операция – замяна
Основният модел е:
sed 's/стар текст/нов текст/' файл
Например:
echo "Hello Linux" | sed 's/Linux/World/'
Резултат:
Hello World
Без допълнителен модификатор sed заменя само първото съвпадение на ред.
Замяна на всички съвпадения
За всички срещания в реда се използва g:
sed 's/Linux/Ubuntu/g' file.txt
Ако файлът съдържа:
Linux is powerful.
Linux is flexible.
резултатът ще бъде:
Ubuntu is powerful.
Ubuntu is flexible.
Модификаторът g е един от най-често използваните при sed.
3. Промяна на файла с -i
Ако искаме промяната да бъде записана директно във файла, използваме -i:
sed -i 's/Linux/Ubuntu/g' file.txt
Това вече променя file.txt.
При конфигурационни файлове обаче е добра практика първо да проверим резултата без -i:
sed 's/Linux/Ubuntu/g' file.txt
След като сме сигурни, можем да приложим промяната.
Практически пример
Да кажем, че в ~/.bashrc имаме:
alias fa='grep -n --color=always -m "Perf: '
И искаме да премахнем Perf: от командата.
Можем да използваме:
sed -i 's/-m "Perf: /-m "/' ~/.bashrc
Това е типичен реален случай за sed: автоматична промяна на конкретен фрагмент в конфигурационен файл.
Преди такава операция е разумно да направим backup:
cp ~/.bashrc ~/.bashrc.bak
След това:
sed -i 's/-m "Perf: /-m "/' ~/.bashrc
И можем да проверим резултата:
grep -n "alias fa" ~/.bashrc
4. Работа с конкретни редове
sed позволява да посочим точно върху кои редове да работи.
Например:
sed '5d' file.txt
изтрива петия ред от изхода.
За диапазон:
sed '5,10d' file.txt
изтрива редове от 5 до 10.
Важно: без -i това не променя файла. Само показва резултата без посочените редове.
За реално изтриване:
sed -i '5,10d' file.txt
5. Извеждане само на определени редове
Опцията -n спира автоматичното извеждане на всички редове.
Комбинира се с p – print.
Например:
sed -n '10p' file.txt
показва само десетия ред.
Диапазон:
sed -n '10,20p' file.txt
показва редове от 10 до 20.
Това е много удобно при диагностика на конфигурационни файлове.
Например:
sed -n '1,30p' /etc/ssh/sshd_config
може да се използва за бърз преглед на началната част на файла.
6. Работа по текстов шаблон
Не е необходимо да знаем номера на реда.
Можем да кажем на sed да работи върху редове, съдържащи определен текст:
sed '/error/d' logfile.txt
Това премахва от изхода всички редове, съдържащи error.
За реална промяна:
sed -i '/error/d' logfile.txt
Можем да използваме и регулярни изрази:
sed '/^#/d' config.txt
Тук ^# означава ред, който започва с #.
Така можем например да премахнем коментарите от конфигурационен файл при генериране на чист изход.
7. Изтриване на празни редове
Един от класическите примери:
sed '/^$/d' file.txt
^$ означава празен ред.
По-удобен вариант за практически задачи е:
sed '/^[[:space:]]*$/d' file.txt
Той премахва както напълно празни редове, така и редове, съдържащи само интервали или tab символи.
8. Замяна само на определени редове
Можем да комбинираме номер на ред с s.
Например:
sed '10s/old/new/' file.txt
заменя old с new само на ред 10.
Диапазон:
sed '10,20s/old/new/g' file.txt
заменя текста само между редове 10 и 20.
Можем да използваме и текстов шаблон като адрес:
sed '/^\[server\]/s/enabled=yes/enabled=no/' config.ini
Тук замяната се извършва само на редовете, започващи с [server].
9. Използване на различен разделител
При работа с пътища често се получава неприятно количество /.
Например:
sed 's/\/var\/www\/html/\/srv\/www/g' file.txt
Работи, но не е особено четимо.
При sed можем да използваме друг разделител:
sed 's#/var/www/html#/srv/www#g' file.txt
Това е напълно валиден синтаксис.
Особено удобно е при:
- Linux paths;
- URLs;
- filesystem configuration;
- Docker volumes;
- Nginx configuration.
10. Работа с регулярни изрази
sed използва регулярни изрази за намиране на текст.
Например:
sed 's/[0-9][0-9]*/NUMBER/g' file.txt
заменя числовите последователности с NUMBER.
При GNU sed можем да използваме -E за Extended Regular Expressions:
sed -E 's/[0-9]+/NUMBER/g' file.txt
-E е стандартизиран и е предпочитан вариант, когато искаме Extended Regular Expressions.
11. Използване на sed с pipe
Една от най-силните страни на sed е работата с pipelines.
Например:
ip addr | sed -n '/inet /p'
Тук резултатът от ip addr се подава към sed.
Друг пример:
ps aux | sed -n '1,10p'
показва първите 10 реда от резултата.
Можем да комбинираме grep и sed:
grep "ERROR" application.log | sed 's/^/[PROBLEM] /'
Получаваме редове с ERROR, като към началото на всеки ред се добавя [PROBLEM].
12. Добавяне и промяна на текст
sed може не само да заменя и изтрива.
Можем да добавим текст преди определен ред:
sed '5i\Нов ред' file.txt
или след него:
sed '5a\Нов ред' file.txt
Можем да заменим целия ред:
sed '5c\Това е новият ред' file.txt
При автоматизирано генериране на конфигурации тези операции могат да бъдат много полезни.
13. Изпълнение на няколко операции
Можем да изпълним няколко sed команди наведнъж:
sed -e 's/foo/bar/g' -e '/^#/d' file.txt
Тук първо се заменя foo с bar, а след това се премахват редовете, започващи с #.
При по-сложни операции можем да използваме ;:
sed 's/foo/bar/g; s/test/prod/g' file.txt
GNU sed поддържа и отделен script файл чрез -f, което е по-подходящо за по-големи автоматизации.
14. Практически пример – промяна на Bash конфигурация
Да разгледаме реален сценарий.
Имаме alias в ~/.bashrc:
alias fa='grep -n --color=always -m "Perf: '
Искаме да променим:
-m "Perf:
на:
-m "
Командата е:
sed -i 's/-m "Perf: /-m "/' ~/.bashrc
След промяната проверяваме:
grep -n "alias fa" ~/.bashrc
Ако всичко е наред, зареждаме отново конфигурацията:
source ~/.bashrc
Това е типичният начин, по който sed се използва в реална Linux администрация: малка, точна и автоматизируема промяна без отваряне на текстов редактор.
15. Backup при използване на -i
При важни конфигурационни файлове можем да поискаме sed да създаде backup.
При GNU/Linux:
sed -i.bak 's/old/new/g' file.txt
Така ще получим:
file.txt
file.txt.bak
Това е значително по-безопасно от директното използване на:
sed -i 's/old/new/g' file.txt
особено когато командата се изпълнява върху системни конфигурации.
16. sed срещу grep, awk и tr
Тези инструменти често се използват заедно, но имат различни силни страни.
| Инструмент | Основна задача |
|---|---|
grep |
Намиране и филтриране на текст |
sed |
Замяна и трансформация на текстови потоци |
awk |
Обработка на структурирани текстови данни |
tr |
Замяна/трансформация на отделни символи |
Например:
grep "ERROR" logfile
е естественият избор за намиране на грешки.
Но:
sed 's/ERROR/WARNING/g' logfile
е подходящ, когато искаме да трансформираме съдържанието.
При по-сложни CSV-подобни данни awk обикновено е по-подходящ.
17. Най-полезните sed конструкции
За ежедневна Linux работа е добре да помним поне следните:
# Замяна на първото съвпадение
sed 's/old/new/' file
# Замяна на всички съвпадения
sed 's/old/new/g' file
# Директна промяна на файла
sed -i 's/old/new/g' file
# Изтриване на ред
sed '5d' file
# Изтриване на диапазон
sed '5,10d' file
# Извеждане на конкретен ред
sed -n '5p' file
# Извеждане на диапазон
sed -n '5,10p' file
# Изтриване на коментари
sed '/^#/d' file
# Изтриване на празни редове
sed '/^$/d' file
# Работа с текстов шаблон
sed '/error/d' file
# Използване на различен разделител
sed 's#/old/path#/new/path#g' file
Заключение
sed е малък инструмент, но е един от фундаменталните инструменти в Linux. С няколко символа можем да заменяме текст, да изтриваме редове, да извличаме информация и да автоматизираме промени в конфигурационни файлове.
Най-важното е да разберем модела:
адрес → команда → действие
Например:
10,20s/old/new/g
означава: в редове 10–20 (адрес) замени (s) всички (g) срещания на old с new.
Когато към това добавим регулярни изрази, pipelines и Bash scripts, sed се превръща от обикновена команда за замяна на текст в мощен инструмент за автоматизация.
Практическото правило е просто: първо изпълни sed без -i, провери резултата и чак след това промени файла. При важни конфигурации още по-добре е да използваш backup.