След греп, следващата логична стъпка е урок за sed. Командата sed идва от Stream EDitor и, както показва името му, се занимава с поток от текст. Въпреки това, ако sed е една от най-мощните команди в Unix, неговата ръководна страница също е сред най-загадъчните. Ще се опитам в тази статия да обобщим най-основното използване на sed и след това да ви дам няколко примера за напреднали скриптове.

Основи

Основната команда за sed е нещо като:

 sed [опция] '{script}' [текстов файл] 

Sed ще изпълни операциите, които искате да направи в текстовия файл и да покаже резултата в стандартния изход. Ако искате резултатът в текстов файл, можете или да го пренасочите чрез обичайния метод:

 sed [опция] '{script}' [текстов файл]> [редактиран текстов файл] 

Или използвайте опцията " -i ", която директно ще редактира входния файл:

 sed -i [опция] '{script}' [текстов файл] 

Сега нека започнем да работим върху сценария. Най-очевидната първа стъпка е нулевият скрипт:

 sed '' test.txt 

просто ще покаже текста в test.txt.

Доброто използване на sed е изтриване. Нека да практикуваме чрез примери.

 sed '2, 4 d' test.txt 

ще изтрие линии 2 до 4 от test.txt.

Можете да предположите, че синтаксисът за скрипта е:

 sed "[първи ред за изтриване] [последна линия за изтриване] d 'test.txt 

Но фантастичната част идва, когато използвате регулярни изрази, или регекс, като разделител за изтриването. Например,

 sed '/ ^ # / d' test.txt 

ще изтрие всеки ред, който започва с "#" (с други думи, ако кодирате, той ще изтрие всичките ви коментари).

Общият синтаксис е

 sed '/ regex / d' test.txt 

за изтриване на реда, съдържащ регенерирането.

 sed '/ regex1 /, / regex2 / d' test.txt 

за изтриване на интервала от линията, съдържаща regex1, до линията, съдържаща regex2.

Специалният знак "^", който използвах в първия пример, е да посоча началото на реда.

Тогава втората основна употреба, за която мога да мисля, е заместването. Общият синтаксис е:

 sed -re 's / regex1 / regex2 /' test.txt 

Той ще има за ефект да търси в първия ред за regex1, да го замени с regex2, преминете към следващия ред и повторете до края на входния поток.

Добър пример е:

 sed -re 's / ^ # * //' test.txt 

Той ще замени символа "#" в началото на реда и всички празни места без нищо. С други думи, той разказва текстовия файл. Символът "*" е мета-знак, който проектира 0 или повече празни интервали тук.

напреднал

Можете да направите някои доста хубави неща със седалище, но вие ще достигнете границата доста бързо, ако не обръщате внимание на нейното основно поведение. Сед се занимава линейно с потока: прилага линейно обработване на текстов файл. Ако искате да направите повече от една промяна на една и съща линия, трябва да използвате етикети и многолинейно третиране. Всичко това може да стане много сложно, много бързо. Сега ще ви покажа няколко примера и ще ви обясня. Ако искате повече, аз съм сигурен, че можете да търсите сами и да използвате основите, които ви дадох.

Ако искате да изтриете празните линии на файл, можете да използвате командата

 sed -re '/ ^ $ / {N; D} "test.txt 

Мета-знакът "$" означава края на линията, така че "^ $" проектира празен ред. След това "{N; D}" е доста сложен синтаксис за изтриване на този ред.

Ако искате да изтриете всеки маркер в html файл, това е командата за вас:

 sed -re ': начало s /] *> // g; / 

"Стартът" се нарича етикет. Това е малко като маркер в скрипта, за който искаме да се върнем по-късно, за да приложим няколко промени в същия ред. sed търси за нещо от формата "" (regex) *>) и го замества с нищо, така че първият html маркер на реда се изтрива. След това, преди да отидете на следващия ред, той проверява дали има нещо, което започва с "<", и ако има такава, тя се връща към етикета ": start" и повторно прилага лечението.

заключение

Вече сте готови да учите по-дълбоко, или просто да го използвате за прости модификации. Това е команда, която намирам за особено полезна в скриптовете като цяло, но ми отне известно време, за да разбера нейния синтаксис. Надявам се, че ще бъде много по-бързо за вас.

Знаете ли още една основна команда за sed? Или използвате друг усъвършенстван скрипт, включващ седал, който искате да споделите? Моля, уведомете ни в коментарите.