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

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

Моћ сед

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

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

Са сед можете учинити све следеће:

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

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

ПОВЕЗАН:Како се користе регуларни изрази (регуларни изрази) на Линуку

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

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

ецхо ховтогонк | сед 'с / гонк / геек /'

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

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

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

Одабир текста

За примере ће нам требати текстуална датотека. Користићемо један који садржи избор стихова из епске песме Семјуела Тејлора Колериџа „Риме древног морнара“.

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

мање цолеридге.ткт

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

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

сед -н '1,4п' цолеридге.ткт

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

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

сед -н '6,9п' цолеридге.ткт

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

сед -н -е '1,4п' -е '31, 34п 'цолеридге.ткт

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

сед -н -е '1,4п' -е '30, 34п 'цолеридге.ткт

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

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

Куцамо следеће:

сед -н '1 ~ 2п' цолеридге.ткт

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

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

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

сед -н '/ ^ И / п' цолеридге.ткт

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

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

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

ецхо ховтогонк | сед 'с / гонк / геек /'

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

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

сед -н 'с / даи / веек / п' цолеридге.ткт

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

сед -н 'с / даи / веек / гп' цолеридге.ткт

Ово се поклапа са три од четири у првој линији. Јер је прва реч „Дан“ и сед разликује велика и мала слова, не сматра да је тај случај исти као „дан“.

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

сед -н 'с / даи / веек / гип' цолеридге.ткт

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

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

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

сед -н 'с / [Дд] аи / веек / гп' цолеридге.ткт

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

сед -н '1,4п' цолеридге.ткт

Потражићемо два размака и заменити их једним. То ћемо урадити глобално, тако да се радња понавља преко целе линије. Да будемо јасни, образац претраживања је размак, свемирска звездица (*), а супституциони низ је један размак. Тхе 1,4 ограничава замену на прва четири реда датотеке.

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

сед -н '1,4 с / * / / гп' цолеридге.ткт

Ово лепо делује! Образац претраге је оно што је овде важно. Звездица (*) представља нулу или више претходног знака, што је размак. Дакле, образац претраживања тражи низове једног простора или више.

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

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

сед -н '1,4 с / * / / гп' цолеридге.ткт

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

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

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

сед -н -е 'с / мотион / флуттер / гип' -е 'с / оцеан / олук / гип' цолеридге.ткт

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

сед -н 'с / мотион / флуттер / гип; с / оцеан / олук / гип' цолеридге.ткт

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

сед -н 'с / [Дд] аи / веек / гп' цолеридге.ткт

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

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

сед -н '/ афтер / с / [Дд] год / недеља / гп' цолеридге.ткт

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

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

Пустимо Цолеридге-а да предахне и искористи сед за извлачење имена из итд. / пассвд фајл.

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

Подизраз морате приложити у заграде [()] да би ово успело. Заградама такође мора претходити коса црта уназад (\) како би се спречило да се према њима поступа као са нормалним ликом.

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

сед 'с / \ ([^:] * \). * / \ 1 /' / етц / пассвд

Раздвојимо ово:

  • сед 'с /: Тхе сед наредба и почетак израза замене.
  • \(: Уводна заграда [(] обухваћајући подизраз којем претходи коса црта (\).
  • [^:]*: Први подизраз израза за претрагу садржи групу у угластим заградама. Тхе царет (^) значи „не“ када се користи у групи. Група значи било који знак који није двотачка (:) биће прихваћени као подударање.
  • \): Закључна заграда [)] са претходном косом косом цртом (\).
  • .*: Овај други подизраз претраживања значи „било који знак и било који њихов број“.
  • /\1: Заменљиви део израза садржи 1 којој претходи коса црта (\). Ово представља текст који се подудара са првим подизразом.
  • /': Закључна коса црта унапред (/) и један наводник (') прекинути сед команда.

Шта ово све значи је да ћемо потражити било који низ знакова који не садржи двотачку (:), што ће бити прва инстанца подударања текста. Затим тражимо било шта друго у том реду, што ће бити друга инстанца подударања текста. Читав ред ћемо заменити текстом који се подудара са првим подизразом.

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

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

Куцамо следеће:

сед 'с / \ ([^:] * \) \ (. * \) / \ 2 /' / етц / пассвд

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

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

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

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

сед 'с /:.*// "/ етц / пассвд

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

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

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

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

сед 'с / ^ \ (. * \), \ (. * \) $ / \ 2, \ 1 / г' геекс.ткт

Ово је наредба за замену попут осталих које смо користили, а образац претраживања је прилично једноставан. Рашчланићемо је у наставку:

  • сед 'с /: Уобичајена наредба замене.
  • ^: Јер карет није у групи ([]), то значи „Почетак линије.“
  • \(.*\),: Први подизраз је било који број било којих знакова. Приложено је у заграде [()], свакој од којих претходи коса црта (\) па га можемо означити бројем. Читав наш образац претраживања до сада се преводи као претрага од почетка реда до прве зареза (,) за било који број било којих знакова.
  • \(.*\): Следећи подизраз је (поново) било који број било ког знака. Такође је приложено у заградама [()], којима оба претходи коса црта (\) тако да одговарајући текст можемо упутити бројевима.
  • $/: Знак долара ($) представља крај реда и омогућиће да се наша претрага настави до краја реда. Ово смо користили једноставно за увођење знака долара. Овде нам заправо није потребна, као звездица (*) би у овом сценарију ишао до краја реда. Коса црта унапред (/) довршава одељак шаблона за претрагу.
  • \ 2, \ 1 / г ': Будући да смо своја два подизраза затворили у заграде, обојицу можемо назвати њиховим бројевима. Будући да желимо да обрнемо редослед, куцамо их као друга утакмица, прва утакмица. Бројевима мора претходити коса црта (\).
  • / г: То омогућава нашој команди да глобално ради на свакој линији.
  • геекс.ткт: Датотека на којој радимо.

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

сед '/ врат / ц Око мог зглоба нанизан је' цолеридге.ткт

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

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

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

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

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

Означили смо бројеве како бисмо ово учинили мало лакшим за праћење.

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

сед '/ Хе / а -> Уметнуто!' геекс.ткт

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

сед '/ Хе / и -> Уметнуто!' геекс.ткт

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

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

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

сед 'с /.*/--> Убачен & /' геекс.ткт

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

сед 'Г' геекс.ткт

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

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

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

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

сед '3д' геекс.ткт

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

сед '4,5д' геекс.ткт

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

сед '6,7! д' геекс.ткт

Чување промена

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

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

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

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

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

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

сед -и'.бак '' /^.*Хе.*$/д 'геекс.ткт

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

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

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

сед -и'.бак '' /^.*Хе.*$/д 'геекс.ткт> нев_геекс.ткт

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

мачка нев_геекс.ткт

Имајући Сед Све то

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

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


$config[zx-auto] not found$config[zx-overlay] not found