Како користити команду сед на Линуку

Можда звучи лудо, али Линук сед команда је уређивач текста без интерфејса. Можете га користити из командне линије за манипулацију текстом у датотекама и стримовима. Показаћемо вам како да искористите његову моћ.

Моћ сед

Команда сед је помало као шах: потребно је сат времена да научите основе и цео живот да их савладате (или, барем доста вежбе). Показаћемо вам избор почетних гамбита у свакој од главних категорија сед функционалности.

сед је а уређивач тока који ради на цевоводном уносу или датотекама текста. Међутим, нема интерактивни интерфејс за уређивање текста. Уместо тога, дајете упутства која треба да следи док функционише кроз текст. Све ово ради у Басх-у и другим шкољкама командне линије.

Са сед-ом можете да урадите све од следећег:

Изаберите текст
Замени текст
Додајте редове у текст
Избришите редове из текста
Измените (или сачувајте) оригиналну датотеку

Структурирали смо наше примере да бисмо представили и демонстрирали концепте, а не да бисмо произвели најинтересантније (и најмање приступачне) сед команде. Међутим, функције подударања шаблона и избора текста сед-а се у великој мери ослањају на регуларне изразе (регуларни изрази). Биће вам потребно мало упознавања са овим да бисте извукли најбоље из сед-а.

Једноставан пример

Прво, користићемо ехо да пошаљемо неки текст у сед кроз цев и да сед замени део текста. Да бисмо то урадили, откуцавамо следеће:

echo howtogonk | sed 's/gonk/geek/'

Команда ецхо шаље „ховтогонк“ у сед, а примењује се наше једноставно правило замене („с“ означава замену). сед претражује улазни текст за појаву првог стринга и замењује сва подударања са другим.

Стринг „гонк“ је замењен са „геек“, а нови низ се штампа у прозору терминала.

Замене су вероватно најчешћа употреба сед-а. Међутим, пре него што можемо да заронимо дубље у замене, морамо да знамо како да изаберемо и ускладимо текст.

Избор текста

Биће нам потребна текстуална датотека за наше примере. Користићемо онај који садржи избор стихова из епске песме Семјуела Тејлора Колриџа „Тхе Риме оф тхе Анциент Маринер“.

Уписујемо следеће да бисмо га погледали са мање:

less coleridge.txt

Резултати из

Да бисмо изабрали неке линије из датотеке, дајемо почетну и крајњу линију опсега који желимо да изаберете. Један број бира ту једну линију.

Да бисмо издвојили редове од један до четири, укуцавамо ову команду:

sed -n '1,4p' coleridge.txt

Обратите пажњу на зарез између 1 и 4. П значи „штампајте подударне линије“. Подразумевано, сед штампа све редове. Видели бисмо сав текст у датотеци са одговарајућим редовима одштампаним двапут. Да бисмо ово спречили, користићемо опцију -н (тихо) да потиснемо неусклађени текст.

Ми мењамо бројеве редова да бисмо могли да изаберемо други стих, као што је приказано у наставку:

sed -n '6,9p' coleridge.txt

Можемо користити опцију -е (израз) да направимо више избора. Са два израза можемо изабрати два стиха, овако:

sed -n -e '1,4p' -e '31,34p' coleridge.txt

Ако у другом изразу смањимо први број, између два стиха можемо уметнути празно место. Укуцавамо следеће:

sed -n -e '1,4p' -e '30,34p' coleridge.txt

Такође можемо изабрати почетну линију и рећи сед-у да пређе кроз датотеку и одштампа алтернативне редове, сваки пети ред, или да прескочи било који број редова. Команда је слична онима које смо користили изнад за одабир опсега. Овај пут, међутим, користићемо тилду (~) уместо зареза да одвојимо бројеве.

Први број означава стартну линију. Други број говори сед-у које линије после почетне линије желимо да видимо. Број 2 означава сваки други ред, 3 значи сваки трећи ред, итд.

Укуцавамо следеће:

sed -n '1~2p' coleridge.txt

Нећете увек знати где се текст који тражите налази у датотеци, што значи да бројеви редова неће увек бити од велике помоћи. Међутим, такође можете да користите сед да бисте изабрали редове који садрже одговарајуће шаблоне текста. На пример, хајде да издвојимо све редове који почињу са „И“.

  Како заштитити ВиФи мрежу од хакера (10 начина) – 2023

Знак (^) представља почетак реда. Наш термин за претрагу ћемо приложити косим цртама (/). Такође укључујемо размак иза „И“ тако да речи попут „Андроид“ неће бити укључене у резултат.

Читање сед скрипти у почетку може бити мало тешко. /п значи „штампање“, баш као што је то било у командама које смо користили изнад. У следећој команди, међутим, претходи коса црта:

sed -n '/^And /p' coleridge.txt

Три реда које почињу са „И“ се издвајају из датотеке и приказују за нас.

Прављење замена

У нашем првом примеру смо вам показали следећи основни формат за сед замену:

echo howtogonk | sed 's/gonk/geek/'

С говори седу да је ово замена. Први низ је образац за претрагу, а други је текст којим желимо да заменимо тај подударни текст. Наравно, као и код свих ствари Линукс, ђаво је у детаљима.

Уписујемо следеће да променимо сва појављивања „дан“ у „седмица“ и дамо морнару и албатросу више времена да се повежу:

sed -n 's/day/week/p' coleridge.txt

У првом реду се мења само друго појављивање „дан“. То је зато што сед престаје након првог меча по реду. Морамо да додамо „г“ на крају израза, као што је приказано у наставку, да извршимо глобалну претрагу тако да се сва подударања у сваком реду обрађују:

sed -n 's/day/week/gp' coleridge.txt

Ово одговара три од четири у првој линији. Пошто је прва реч „дан“, а сед разликује велика и мала слова, не сматра да је та инстанца иста као „дан“.

Откуцавамо следеће, додајући и команди на крају израза да бисмо указали на неосетљивост на велика и мала слова:

sed -n 's/day/week/gip' coleridge.txt

Ово функционише, али можда нећете увек желети да укључите неосетљивост на велика и мала слова за све. У тим случајевима, можете да користите групу регуларних израза да бисте додали неосетљивост на мала и мала слова која је специфична за образац.

На пример, ако ставимо знакове у угласте заграде ([]), они се тумаче као „било који знак са ове листе знакова“.

Откуцавамо следеће и укључујемо „Д“ и „д“ у групу, како бисмо осигурали да се подудара и са „Даном“ и „Даном“:

sed -n 's/[Dd]ay/week/gp' coleridge.txt

Такође можемо ограничити замене на делове датотеке. Рецимо да наш фајл садржи чудне размаке у првом стиху. Можемо користити следећу познату команду да видимо први стих:

sed -n '1,4p' coleridge.txt

Потражићемо два простора и заменити их једним. Урадићемо ово глобално тако да се радња понавља преко целе линије. Да будемо јасни, образац претраге је размак, размак звездица

, а стринг за замену је један размак. 1,4 ограничава замену на прва четири реда датотеке.

sed -n '1,4 s/  */ /gp' coleridge.txt

Све то састављамо у следећу команду:

Ово добро функционише! Образац претраживања је оно што је овде важно. Звездица

представља нулу или више претходног знака, што је размак. Дакле, образац претраге тражи низове од једног или више размака.

sed -n '1,4 s/ */ /gp' coleridge.txt

Ако заменимо један размак за било коју секвенцу од више размака, вратићемо датотеку на уобичајени размак, са једним размаком између сваке речи. Ово ће такође заменити један простор за један размак у неким случајевима, али то неће негативно утицати на ништа—и даље ћемо добити жељени резултат.

Ако унесемо следеће и смањимо образац за претрагу на један размак, одмах ћете видети зашто морамо да укључимо два размака:

Пошто звездица одговара нули или више претходног знака, она сваки знак који није размак види као „нулти размак“ и примењује замену на њега.

sed -n -e 's/motion/flutter/gip' -e 's/ocean/gutter/gip' coleridge.txt

Међутим, ако укључимо два размака у образац претраге, сед мора пронаћи најмање један знак размака пре него што примени замену. Ово осигурава да ће знакови без размака остати нетакнути.

sed -n 's/motion/flutter/gip;s/ocean/gutter/gip' coleridge.txt

Укуцавамо следеће, користећи -е (израз) који смо раније користили, што нам омогућава да направимо две или више замена истовремено:

sed -n 's/[Dd]ay/week/gp' coleridge.txt

Можемо постићи исти резултат ако користимо тачку и зарез (;) да одвојимо два израза, на следећи начин:

  Како играти Тхе Рифтбреакер на Линуку

Када смо заменили „дан“ за „седмицу“ у следећој команди, инстанца „дан“ у изразу „добро дан“ је такође замењена:

sed -n '/after/ s/[Dd]ay/week/gp' coleridge.txt

Да бисмо ово спречили, можемо покушати замене само на линијама које одговарају другом обрасцу. Ако модификујемо команду тако да има образац претраге на почетку, размотрићемо рад само на линијама које одговарају том шаблону.

Откуцавамо следеће да би наш одговарајући образац био реч „после“:

То нам даје одговор који желимо.

Сложеније замене

Хајде да оставимо Цолеридгеа на паузи и користимо сед за издвајање имена из етц/пассвд датотеке. [()] Постоје краћи начини да се ово уради (више о томе касније), али ми ћемо овде користити дужи пут да демонстрирамо други концепт. Свака подударна ставка у обрасцу претраге (који се називају подизрази) може бити нумерисана (највише девет ставки). Затим можете користити ове бројеве у вашим сед командама да бисте референцирали одређене подизразе.

Подизраз морате ставити у заграде

sed 's/([^:]*).*/1/' /etc/passwd

да би ово функционисало. Заградама такође мора претходити коса црта () како би се спречило да се третирају као нормалан карактер.

Да бисте то урадили, откуцали бисте следеће:
Хајде да разложимо ово: [(] сед ‘с/: команда сед и почетак израза замене.
[^:](: Почетна заграда
који обухвата подизраз, којем претходи обрнута коса црта (). [)] *: Први подизраз термина за претрагу садржи групу у угластим заградама. Карет (^) значи „не“ када се користи у групи. Група значи да ће сваки знак који није двотачка (:) бити прихваћен као подударање.
): Завршна заграда
са претходном косом цртом ().
.*: Овај други подизраз претраге значи „било који знак и било који број њих“.

/1: Део израза за замену садржи 1 којем претходи обрнута коса црта (). Ово представља текст који одговара првом подизразу.

/’: Затварајућа коса црта (/) и једноструки наводник (‘) завршавају команду сед.

Све ово значи да ћемо потражити било који низ знакова који не садржи двотачку (:), што ће бити прва инстанца одговарајућег текста. Затим тражимо било шта друго у тој линији, што ће бити друга инстанца подударног текста. Цео ред ћемо заменити текстом који одговара првом подизразу. [()] Сваки ред у датотеци /етц/пассвд почиње корисничким именом које се завршава двотачком. Упарујемо све до првог двотачка, а затим ту вредност замењујемо за цео ред. Дакле, изоловали смо корисничка имена.

Затим ћемо други подизраз ставити у заграде

sed 's/([^:]*)(.*)/2/' /etc/passwd

тако да га можемо референцирати и бројем. Такође ћемо заменити 1 са 2. Наша команда ће сада заменити цео ред са свиме од првог двотачка (:) до краја реда.

Укуцавамо следеће:

Те мале измене инвертују значење наредбе и добијамо све осим корисничких имена.

Сада, хајде да погледамо брз и лак начин да то урадимо.

sed 's/:.*//" /etc/passwd

Наш термин за претрагу је од првог двотачка (:) до краја реда. Пошто је наш израз замене празан (//), нећемо заменити подударни текст ничим.

Дакле, откуцавамо следеће, одсецајући све од прве две тачке (:) до краја реда, остављајући само корисничка имена:

cat geeks.txt

Погледајмо пример у којем референцирамо прво и друго подударање у истој команди.

sed 's/^(.*),(.*)$/2,1 /g' geeks.txt

Имамо фајл са зарезима (,) који раздвајају имена и презимена. Желимо да их наведемо као „презиме, име“. Можемо користити цат, као што је приказано у наставку, да видимо шта је у датотеци:

Као и многе сед команде, ова следећа би у почетку могла изгледати непробојна:
Ово је команда за замену попут осталих које смо користили, а образац претраге је прилично једноставан. Раставићемо га у наставку:[]сед ‘с/: Нормална команда замене.
^: Зато што карет није у групи ( [()]), то значи „почетак линије“.
(.*),: Први подизраз је било који број било ког карактера. У загради је [()], од којих сваком претходи обрнута коса црта () тако да можемо да га референцирамо бројем. Наш цео образац претраге до сада се преводи као претрага од почетка реда до првог зареза (,) за било који број било ког карактера.
(.*): Следећи подизраз је (опет) било који број било ког знака. Такође је затворено у заградама
, којима претходи обрнута коса црта () тако да можемо референцирати одговарајући текст по броју.
$/: Знак долара ($) представља крај реда и омогућава да се наша претрага настави до краја реда. Користили смо ово једноставно да уведемо знак долара. Овде нам баш и не треба, као звездица
би ишао до краја реда у овом сценарију. Коса црта (/) завршава одељак обрасца претраге.

  Како ресетовати лозинку за СоундЦлоуд

2,1 /г’: Пошто смо наша два подизраза ставили у заграде, можемо се позвати на оба по бројевима. Пошто желимо да обрнемо редослед, куцамо их као друго подударање, прво подударање. Бројевима мора претходити обрнута коса црта ().

sed '/neck/c Around my wrist was strung' coleridge.txt

/г: Ово омогућава нашој команди да ради глобално на свакој линији.

геекс.ткт: Датотека на којој радимо.

Такође можете користити команду Исеци (ц) да замените читаве редове који одговарају вашем обрасцу претраге. Укуцавамо следеће да бисмо потражили ред са речју „врат“ и заменили га новим низом текста:

Наша нова линија се сада појављује на дну нашег екстракта.

Уметање линија и текста

Такође можемо да убацимо нове редове и текст у нашу датотеку.  Да бисмо уметнули нове редове после оних који се подударају, користићемо команду Додај (а).

Ево датотеке са којом ћемо радити:

цат геекс.ткт

sed '/He/a --> Inserted!' geeks.txt

Тхе

Нумерирали смо редове да бисмо ово мало лакше пратили.

sed '/He/i --> Inserted!' geeks.txt

Укуцавамо следеће да бисмо потражили редове који садрже реч „Он“ и убацили нови ред испод њих:

Уметнуто!’ геекс.ткт” наредба у прозору терминала.” видтх=”646″ хеигхт=”262″ онлоад=”пагеспеед.лазиЛоадИмагес.лоадИфВисиблеАндМаибеБеацон(тхис);” онеррор=”тхис.онеррор=нулл;пагеспеед.лазиЛоадИмагес.лоадИфВисиблеАндМаибеБеацон(тхис);”>

Откуцавамо следеће и укључујемо команду Инсерт (и) да бисмо уметнули нови ред изнад оних који садрже одговарајући текст:

Уметнуто!’ геекс.ткт” наредба у прозору терминала.” видтх=”646″ хеигхт=”262″ онлоад=”пагеспеед.лазиЛоадИмагес.лоадИфВисиблеАндМаибеБеацон(тхис);” онеррор=”тхис.онеррор=нулл;пагеспеед.лазиЛоадИмагес.лоадИфВисиблеАндМаибеБеацон(тхис);”>

sed 's/.*/--> Inserted &/' geeks.txt

Можемо користити амперсанд (&), који представља оригинални подударни текст, да додамо нови текст у одговарајући ред. 1, 2 и тако даље представљају подизразе који се подударају.

Да бисмо додали текст на почетак реда, користићемо команду за замену која одговара свему на реду, у комбинацији са клаузулом за замену која комбинује наш нови текст са оригиналном линијом.

sed 'G' geeks.txt

Да бисмо све ово урадили, откуцавамо следеће:

Уметнута команда &/’ геекс.ткт” у прозор терминала.” видтх=”646″ хеигхт=”212″ онлоад=”пагеспеед.лазиЛоадИмагес.лоадИфВисиблеАндМаибеБеацон(тхис);” онеррор=”тхис.онеррор=нулл;пагеспеед.лазиЛоадИмагес.лоадИфВисиблеАндМаибеБеацон(тхис);”>

Укуцавамо следеће, укључујући Г команду, која ће додати празан ред између сваког реда:

Ако желите да додате два или више празних линија, можете користити Г;Г, Г;Г;Г итд.

sed '3d' geeks.txt

Брисање линија

sed '4,5d' geeks.txt

Команда Делете (д) брише линије које одговарају узорку претраге или оне наведене са бројевима линија или опсезима.

sed '6,7!d' geeks.txt

На пример, да бисмо избрисали трећи ред, откуцали бисмо следеће:

Да бисмо избрисали опсег редова четири до пет, откуцали бисмо следеће:

Да избришемо линије изван опсега, користимо узвичник (!), као што је приказано у наставку:

Чување ваших промена

До сада су сви наши резултати штампани у прозору терминала, али их још увек нисмо нигде сачували. Да бисте их учинили трајним, можете или да упишете своје измене у оригиналну датотеку или да их преусмерите на нову.

Замена оригиналне датотеке захтева одређени опрез. Ако је ваша команда сед погрешна, можда ћете направити неке промене у оригиналној датотеци које је тешко опозвати.

За мало мира, сед може да направи резервну копију оригиналне датотеке пре него што изврши своју команду.

sed -i'.bak' '/^.*He.*$/d' geeks.txt

Можете користити опцију Ин-плаце (-и) да кажете сед-у да упише промене у оригиналну датотеку, али ако јој додате екстензију датотеке, сед ће направити резервну копију оригиналне датотеке у нову. Имаће исто име као оригинална датотека, али са новом екстензијом датотеке.

cat geeks.txt.bak

Да бисмо демонстрирали, потражићемо све редове који садрже реч „Он“ и обрисати их. Такође ћемо направити резервну копију наше оригиналне датотеке у нову користећи БАК екстензију.

sed -i'.bak' '/^.*He.*$/d' geeks.txt > new_geeks.txt

Да бисмо све ово урадили, откуцавамо следеће:

cat new_geeks.txt

Укуцавамо следеће да бисмо били сигурни да је наша резервна датотека непромењена:

Такође можемо да откуцамо следеће да бисмо преусмерили излаз на нову датотеку и постигли сличан резултат:

Користимо цат да потврдимо да су промене уписане у нову датотеку, као што је приказано у наставку: нев_геекс.ткт“ и „цат нев_геекс.ткт“ команде у прозору терминала.“ видтх=”646″ хеигхт=”307″ онлоад=”пагеспеед.лазиЛоадИмагес.лоадИфВисиблеАндМаибеБеацон(тхис);” онеррор=”тхис.онеррор=нулл;пагеспеед.лазиЛоадИмагес.лоадИфВисиблеАндМаибеБеацон(тхис);”>Имајући сед Алл Тхат

Као што сте вероватно приметили, чак и овај брзи прајмер за сед је прилично дугачак. Има много у овој команди, а има чак

више можете учинити с тим

.

Међутим, надамо се да су ови основни концепти пружили чврсту основу на којој можете градити док настављате да учите више.