Linux командата 'sed' означава редактор на потоци. Използва се за редактиране на потоци (файлове) с помощта на регулярни изрази. Но това редактиране не е постоянно. Той остава само на дисплея, но реално съдържанието на файла остава същото.
Основно се използва за заместване на текст; освен това може да се използва за други операции за манипулиране на текст като вмъкване, изтриване, търсене и др. Командата sed ни позволява да редактираме файлове, без да ги отваряме. Поддръжката на регулярни изрази го прави по-мощен инструмент за манипулиране на текст.
Преглед на командата sed
Това е помощна програма за Unix, която трансформира и анализира текст с компактен и прост език за програмиране. Той беше интегриран от 1973 до 1974 г. от Лий Е. Макмеън от Bell Labs и днес присъства в почти всяка операционна система. Командата sed се основаваше на аспектите на скриптовете на по-ранния qed (бърз редактор) и интерактивния редактор ed. Това беше най-ранният инструмент за поддръжка на регулярни изрази и остава активен за обработка на текст, най-важното с командата за заместване. Известни алтернативни инструменти включват Perl и AWK за 'редактиране на поток' и манипулиране на низове в обикновен текст.
Режим на работа на командата sed
Командата sed е ориентирана към редове помощна програма за обработка на текст: тя ред по ред чете текст от файл или входен поток във вътрешен буфер, известен като пространство на шаблона. Всички четения на редове започват цикъл. Командата sed използва една или няколко операции, които са описани от sed скрипт в пространството на шаблона. Той работи с език за програмиране, използвайки около 25 команди, които описват операциите над текста.
За всички входни редове командата sed обикновено води до пространството на шаблона и започва цикъла със следващия ред отново след изпълнение на скрипта. Други естества на края на скрипта са достъпни от командите на скрипта и задайте опции, например N за незабавно включване на следващия ред в пространството на шаблона, q за излизане, d за премахване на пространството на шаблона и т.н. Следователно, sed скриптът се отнася до тяло на цикъл, което итерира от streamline, в който променливата на цикъла и самият цикъл се поддържат и имплицитно от sed.
- Sed скриптът може да бъде описан в командния ред или прочетен чрез изолиран файл. В скрипта sed командите могат да приемат допълнителен адрес в контекста на регулярни изрази или номера на редове. Адресът решава кога да се изпълни командата. Например, 2d ще изпълни само командата d (или изтриване) на втория входен ред, докато /^ /d ще премахне всеки ред, започващ с интервал.
- Пространството за задържане, изолиран специален буфер, може да се използва от някои sed команди за задържане на натрупващ се текст между циклите. Командният език на sed има само две променливи (пространство за модел и пространство за задържане) и функционалност за разклоняване, подобна на GOTO. Езикът обаче е пълен по Тюринг. Езотеричните sed скриптове са налични за няколко игри като тетрис, шах, арканоид и сокобан.
- Основният цикъл се изпълнява за всички редове на входния поток, като проверява скрипта sed на всички редове на входа. Редовете на скрипта на sed са двойка шаблон-действие, представяща какъв шаблон за съпоставяне и кое действие да се приложи, което може да се копира като условен израз. Действията по подразбиране (отпечатване на шаблонно пространство, копиране на линия в шаблонно пространство), входни и изходни потоци и работни променливи (задържане на пространство и шаблонно пространство) са имплицитни; възможно е да се определят кратки едноредови програми поради основния цикъл.
Използване на командата sed
- Каретката (^) е същата като началото на реда.
- Символът за долар ($) е същият като завършването на реда.
- Звездичката (*) е същата като повече или нула предишно появяване на знак.
- Символът плюс (+) е същият като един или няколко предишни срещания на знаци.
- Въпросителният знак (?) е същият като повече или нула предишно появяване на знак.
- Символът точка (.) е точно същият като един символ.
Примерът по-долу представя най-командната и типична употреба на командата sed, т.е. заместване. Използването беше действителната мотивация за командата sed:
sed 's/regexp/replacement/g' inputFileName > outputFileName
Възможни са и други начини за проста обработка с около 25 sed команди. Например, по-долу се използва опцията d за филтриране на редове, които включват само интервали и края на знака на реда:
sed '/^ *$/d' inputFileName
Горният пример използва няколко от метасимволите на регулярен израз по-долу:
Често командата sed се използва като филтър в конвейер под Unix:
$generateData | sed 's/x/y/g'
Програмата generateData генерира данни, а командата sed прави малка промяна, като замества x на мястото на y.
Често е полезно да поставите много sed команди, по една команда на всеки ред, вътре в скрипт файл и да използвате флага -f, за да изпълните командите от файла:
sed -f subst.sed inputFileName > outputFileName
Синтаксис:
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
Настроики:
Следват някои опции на командния ред на командата sed:
-n, --тихо, --безшумно: Той силно ни позволява да отпечатаме пространство на модела.
-e скрипт, --expression=script: Използва се за добавяне на скрипта към командите, които трябва да бъдат изпълнени.
-f скрипт-файл, --file=скрипт-файл: Използва се за добавяне на съдържанието на скрипт-файла към командите, които трябва да бъдат изпълнени.
--follow-symlinks: използва се за следване на символни връзки при обработка на място.
-i[SUFFIX], --in-place[=SUFFIX]: използва се за редактиране на файлове на място (създава резервно копие, ако е предоставена опция SUFFIX).
-l N, --line-length=N: Използва се за указване на желаната дължина на реда за командата `l'.
--posix: използва се за деактивиране на всички разширения на GNU.
-E, -r, --regexp-разширен: Позволява ни да използваме разширените регулярни изрази в скрипта (за преносимост използвайте POSIX -E).
-s, --отделно: използва се за разглеждане на файлове като отделни, а не като единични и продължава дългия поток.
--пясъчна кутия: Използва се за работа в режим sandbox.
dfs срещу bfs
-u, --небуфериран: Използва се за зареждане на минимални количества данни от входните файлове и по-често почиства изходните буфери.
-z, --нулеви данни: Използва се за разделяне на редове с NUL символи.
--помогне: използва се за показване на помощното ръководство.
--версия: Използва се за показване на информация за версията.
Примери за команда sed
Да видим следните примери:
- Прилагане към директорията STDIN
- Глобална подмяна
- Премахване на линия
- Използване на командата Multiple sed
- Четене на команди от файл
- Подмяна на символи
- Ограничаване на sed
- Вмъкване и добавяне на текст
- Модифициране на линии
- Трансформация на героите
- Отпечатване на номерата на редовете
Прилагане към директорията STDIN
Командата sed не е ограничена само до манипулиране на файлове; също така можем да го приложим към STDIN директорията.
echo class7 | sed 's/class/jtp/' echo class7 | sed 's/7/10/' cat msg.txt | sed 's/learn/study/'
Горните команди ще заменят първия текст с втория текстов модел. Помислете за резултата по-долу:
От горния изход, първо, изпълнихме команда 'sed' на низ 'class7', където 'class' се променя на 'jtp' и 7 на 10. След това изпълнихме команда 'sed' на поток 'msg.txt където „научавам“ се преобразува в „уча“.
Глобална подмяна
В предишния пример всички думи за „учене“ не бяха редактирани в „учене“. За да редактираме всяка дума, трябва да използваме глобална замяна 'g'. Той ще редактира всички посочени думи във файл или низ.
Синтаксис:
command | sed 's///g'
Разгледайте примерите по-долу:
echo class7 class9 | sed 's/class/jtp/g' cat msg.txt | sed 's/learn/study/g'
Горните команди ще заменят целия зададен текстов шаблон. Помислете за резултата по-долу:
От горния изход, като изпълните командата 'echo class7 class9 | sed 's/class/jtp/g'' целият 'class' се преобразува в 'jtp' и с команда 'cat msg.txt | sed 's/learn/study/g'' цялото 'learn' беше преобразувано в 'study'.
Премахване на линия
Опцията 'd' ще ни позволи да премахнем цял ред от файл. Трябва само да посочим дума от този ред с опцията 'd' и този ред ще бъде изтрит. Но имайте предвид, че всички редове, съдържащи същата дума, ще бъдат изтрити. Той ще бъде изпълнен като:
cat | sed '//d'
Помислете за командата по-долу:
cat msg.txt | sed '/jtp/d'
Горната команда ще изтрие редовете с думата 'jtp'. Помислете за резултата по-долу:
От горния резултат, като изпълните командата 'cat msg.txt | sed '/jtp/d'' всички редове, съдържащи думата 'jtp' се изтриват.
Използване на командата Multiple sed
Опцията '-e' ни позволява да изпълним няколко sed команди наведнъж. Можем да извършим повече от една sed операция, като изпълним командата като:
sed -e ' ; '
Помислете за командата по-долу:
sed -e 's/red/blue/; s/yellow/black/' exm.txt
Горната команда ще приложи всички посочени операции във файла „exm.txt“. Помислете за резултата по-долу:
Както можем да видим от горния резултат, всички „червени“ думи са заменени със „сини“, а всички „жълти“ думи са заменени с „черни“. Можем също да разделяме команди по следния начин:
sed -e ' >s/red/blue/; >s/yellow/black/' exm.txt
Резултатът ще бъде същият като горната команда.
Четене на команди от файл
Можем да запазим sed командите във файл и да ги приложим наведнъж във всеки файл. Това може да стане, като посочите опцията '-f', както следва:
sed -f
От горната команда '' е файл, който има списък с команди sed. Помислете за командата по-долу:
sed -f SedCommands exm.txt
Горната команда ще приложи всички посочени команди във файла „SedCommand“ на „exm.txt“. Помислете за резултата по-долу:
От горния резултат използвахме команди, приложени към по-ранния пример. И така, резултатът е същият като в предишния пример.
Подмяна на символи
Можем да използваме удивителния знак (!) като разделител на низове. Например, искаме да заменим bash shell и да го заменим с csh shell в '/etc/passwd'. За да направите това, изпълнете командата по-долу:
sed 's//bin/bash//bin/csh/' /etc/passwd
Можем да постигнем същия резултат, като изпълним командата по-долу:
sed 's!/bin/bash!/bin/csh!' /etc/passwd
Ограничаване на sed
Основното използване на командата sed обработва целия файл. Но можем да ограничим командата sed и да посочим всеки ред. Има два начина за ограничаване на командата sed:
- Набор от линии.
- Модел, който съответства на конкретна линия.
Можем да предоставим номер, за да посочим ред, както следва:
sed '3s/Red/Blue/' exm.txt
Горната команда ще приложи указаната операция на третия ред. Помислете за резултата по-долу:
От горния изход само третият ред е модифициран.
Можем също да посочим диапазон от линии. За да зададете диапазон от редове, изпълнете командата, както следва:
sed '1,3s/Red/Blue/' exm.txt
Горната команда ще актуализира посочения текст в редове 1 и 3. Разгледайте изхода по-долу:
Вмъкване и добавяне на текст
Флаговете „i“ и „a“ се използват за вмъкване и добавяне на текст към файл. Флагът „i“ ще добави текста преди низа, а флагът „a“ се използва за добавяне на текст след низа. Помислете за командата по-долу:
echo 'Another Demo' | sed 'iFirst Demo'
Горната команда ще вмъкне текста преди текста „Още една демонстрация“. Помислете за резултата по-долу:
За да добавите текст, изпълнете командата, както следва:
echo 'Another Demo' | sed 'aFirst Demo'
Горната команда ще добави текста. Помислете за резултата по-долу:
Модифициране на линии
Флагът 'c' се използва за модифициране на определен ред. За да промените ред, изпълнете командата, както следва:
sed '3cThis is a modified line.' exm.txt
Горната команда ще актуализира третия ред. Помислете за резултата по-долу:
Можем също да използваме регулярен израз, за да актуализираме повече от един ред с един и същ модел. Помислете за командата по-долу:
sed '/Apple is /c Line updated.' exm.txt
Горната команда ще актуализира всички редове, съдържащи низ 'Apple is'. Помислете за резултата по-долу:
Трансформация на героите
Флагът 'y' се използва за трансформиране на знаците. Трансформацията на героите не може да бъде ограничена до конкретни събития. За да трансформирате символи, изпълнете командата, както следва:
sed 'y/abc/def/' exm.txt
Горната команда ще трансформира знаците 'a', 'b', 'c' в 'd', 'e', 'f'. разгледайте изхода по-долу:
Отпечатване на номерата на редовете
Знакът '=' се използва за отпечатване на номера на реда. За да отпечатате номера на реда, изпълнете командата, както следва:
sed '=' exm.txt
Горната команда ще покаже номера на реда на съдържанието на файла. Помислете за резултата по-долу:
Знакът за равенство с опцията '-n' указва номера на реда, който съдържа съответстващ скрипт. Помислете за резултата по-долу:
sed -n '/mango/=' exm.txt
Горната команда ще покаже номера на реда, който съдържа думата „манго“. Помислете за резултата по-долу:
От горния резултат можем да видим, че ред номер 2 има думата „манго“.