Xavfsizlik.  Sozlash; o'rnatish.  Internet.  Qayta tiklash.  O'rnatish

From va to bash sed. Kengaytirilgan sed: Linuxda matn oqimlarini boshqarish

Oxirgi marta biz bash skriptlaridagi funktsiyalar, xususan, ularni buyruq satridan qanday chaqirish haqida gapirgan edik. Bizning bugungi mavzuimiz qatorli ma'lumotlarni qayta ishlash uchun juda foydali vosita - sed deb nomlangan Linux yordam dasturi. Ko'pincha jurnal fayllari, konfiguratsiya va boshqa fayllar ko'rinishidagi matnlar bilan ishlash uchun ishlatiladi.



Agar siz bash skriptlarida har qanday ma'lumotlarni manipulyatsiya qilmoqchi bo'lsangiz, sed va gawk vositalari bilan tanishishni xohlaysiz. Bu erda biz sed va matnlar bilan ishlashga e'tibor qaratamiz, chunki bu bizning bash skriptini ishlab chiqishning keng doiralari bo'ylab sayohatimizdagi juda muhim qadamdir.

Endi biz sed bilan ishlash asoslarini ko'rib chiqamiz, shuningdek, ushbu vositadan foydalanishning o'ndan ortiq misollarini ko'rib chiqamiz.

sed bilan ishlash asoslari

sed yordam dasturi oqimli matn muharriri deb ataladi. Nano kabi interaktiv matn muharrirlarida siz klaviatura yordamida matnlar bilan ishlaysiz, fayllarni tahrirlaysiz, matnlarni qo'shasiz, o'chirasiz yoki o'zgartirasiz. Sed sizga ishlab chiquvchi tomonidan belgilangan qoidalar to'plami asosida ma'lumotlar oqimini tahrirlash imkonini beradi. Bu buyruq qanday ko'rinishga ega:

$sed variantlar fayli
Odatiy bo'lib, sed chaqirilganda belgilangan buyruqlar to'plami sifatida ifodalangan qoidalarni STDIN ga qo'llaydi. Bu sizga ma'lumotlarni to'g'ridan-to'g'ri sed-ga o'tkazish imkonini beradi.

Masalan, bu kabi:

$ echo "Bu sinov" | sed "s/test/boshqa test/"
Ushbu buyruqni bajarganingizda shunday bo'ladi.


sed chaqirishning oddiy misoli

Bunday holda, sed qayta ishlashga o'tgan qatordagi "test" so'zini "boshqa test" so'zlari bilan almashtiradi. Qo'shtirnoq ichiga olingan matnni qayta ishlash qoidasini shakllantirish uchun oldinga qiyshiq chiziqlar qo'llaniladi. Bizning holatlarimizda biz s/pattern1/pattern2/ kabi buyruqdan foydalandik. "S" harfi "almashtirish" so'zining qisqartmasi, ya'ni bizda almashtirish buyrug'i mavjud. Sed, ushbu buyruqni bajarib, uzatilgan matnni ko'rib chiqadi va undagi bo'laklarni (qaysi biri haqida quyida gaplashamiz) shablon2 bilan almashtiradi.

Yuqorida sizni tezlashtirish uchun sed dan foydalanishning ibtidoiy misoli keltirilgan. Aslida, sed fayllar bilan ishlash kabi matnni qayta ishlashning ancha murakkab stsenariylarida ishlatilishi mumkin.

Quyida matnning bir qismi va uni ushbu buyruq yordamida qayta ishlash natijalarini o'z ichiga olgan fayl mavjud:

$ sed "s/test/boshqa test" ./myfile


Matn fayli va uni qayta ishlash natijalari

Bu yuqorida biz ishlatgan yondashuvdan foydalanadi, ammo endi sed faylda saqlangan matnni qayta ishlaydi. Biroq, agar fayl etarlicha katta bo'lsa, sed ma'lumotlarni bo'laklarga bo'lib qayta ishlashini va butun faylning qayta ishlanishini kutmasdan, ekranda ishlov berilgan narsalarni ko'rsatishini sezasiz.

Sed qayta ishlayotgan fayldagi ma'lumotlarni o'zgartirmaydi. Tahrirlovchi faylni o'qiydi, u o'qiganini qayta ishlaydi va natijani STDOUTga yuboradi. Manba fayl o'zgarmaganligiga ishonch hosil qilish uchun uni sed-ga o'tkazilgandan so'ng ochish kifoya. Agar kerak bo'lsa, sed chiqishi faylga yo'naltirilishi mumkin, ehtimol eski faylni qayta yozish. Agar siz ushbu seriyadagi kirish va chiqish oqimlarini qayta yo'naltirish haqida gapiradigan oldingi maqolalardan biri bilan tanish bo'lsangiz, buni amalga oshirishingiz kerak.

sed ga qo'ng'iroq qilishda buyruqlar to'plamini bajarish

Ma'lumotlarda bir nechta amallarni bajarish uchun sed ga qo'ng'iroq qilishda -e tugmasidan foydalaning. Masalan, ikkita matn bo'lagini almashtirishni qanday tashkil qilish kerak:

$ sed -e "s/Bu/Bu/; s/test/boshqa test/" ./myfile


Sedga qo'ng'iroq qilishda -e tugmasidan foydalanish

Ikkala buyruq ham fayldagi matnning har bir satriga qo'llaniladi. Ular nuqtali vergul bilan ajratilishi kerak va buyruq oxiri bilan nuqtali vergul o'rtasida bo'sh joy qolmasligi kerak.
Sed ga qo'ng'iroq qilishda bir nechta matnni qayta ishlash naqshlarini kiritish uchun siz birinchi bitta qo'shtirnoqni kiritganingizdan so'ng Enter tugmasini bosishingiz va har bir qoidani yangi qatorga kiritishingiz mumkin, bunda yopilish tirnoqini unutmang:

$ sed -e " > s/Bu/Bu/ > s/test/boshqa test/" ./myfile
Bu shaklda berilgan buyruq bajarilgandan keyin sodir bo'ladi.


sed bilan ishlashning yana bir usuli

Fayldan buyruqlarni o'qish

Agar sizda matnni qayta ishlash uchun ishlatilishi kerak bo'lgan juda ko'p sed buyruqlari bo'lsa, ularni faylga oldindan yozib qo'yganingiz ma'qul. Buyruqlarni o'z ichiga olgan sed faylini belgilash uchun -f tugmasidan foydalaning:

Mana mycommands faylining mazmuni:

S/Bu/Bu/ s/test/boshqa test/
Muharrirga buyruqlar va ishlov berish uchun faylni uzatib, sed deb nomlaymiz:

$ sed -f mening faylim buyruqlari
Bunday buyruqni chaqirishda natija oldingi misollarda olingan natijaga o'xshaydi.


Sed ga qo'ng'iroq qilishda buyruq faylidan foydalanish

Buyruq bayroqlarini almashtiring

Quyidagi misolni diqqat bilan ko'rib chiqing.

$sed "s/test/boshqa test/" mening faylim
Bu faylda mavjud bo'lgan va sed uni qayta ishlagandan keyin olinadigan narsa.


Manba fayli va uni qayta ishlash natijalari

O'zgartirish buyrug'i odatda ko'p qatorli faylni boshqaradi, lekin har bir satrda qidirilayotgan matnning faqat birinchi holatlari almashtiriladi. Naqshning barcha holatlarini almashtirish uchun siz tegishli bayroqdan foydalanishingiz kerak.

Bayroqlardan foydalanishda almashtirish buyrug'ini yozish sxemasi quyidagicha ko'rinadi:

S/naqsh/almashtirish/bayroqlar
Ushbu buyruqning bajarilishi bir necha usul bilan o'zgartirilishi mumkin.

  • Raqamni uzatishda satrda naqsh paydo bo'lishining seriya raqami hisobga olinadi va aynan shu hodisa almashtiriladi.
  • g bayrog'i satrdagi naqshning barcha holatlarini qayta ishlash kerakligini ko'rsatadi.
  • p bayrog'i asl satr tarkibini chop etish kerakligini bildiradi.
  • w fayl bayrog'i matnni qayta ishlash natijalarini faylga yozish buyrug'ini bildiradi.
Kerakli fragmentning almashtirilgan paydo bo'lish o'rnini ko'rsatib, almashtirish buyrug'ining birinchi versiyasidan foydalanishni ko'rib chiqaylik:

$ sed "s/test/boshqa test/2" mening faylim

O'zgartirilishi kerak bo'lgan fragmentning o'rnini ko'rsatuvchi almashtirish buyrug'ini chaqirish

Bu erda biz 2 raqamini almashtirish bayrog'i sifatida ko'rsatdik.Bu har bir satrda kerakli naqshning faqat ikkinchi marta takrorlanishiga olib keldi. Endi global almashtirish bayrog'ini sinab ko'raylik - g:

$ sed "s/test/boshqa test/g" mening faylim
Chiqarish natijalaridan ko'rinib turibdiki, bunday buyruq matndagi naqshning barcha holatlarini almashtirdi.


Global almashtirish

almashtirish buyrug'i bayrog'i p sizga mos keladigan satrlarni chop etishga imkon beradi, sed ga qo'ng'iroq qilishda ko'rsatilgan -n opsiyasi esa oddiy chiqishni bostiradi:

$ sed -n "s/test/boshqa test/p" mening faylim
Natijada, ushbu konfiguratsiyada sed ishga tushirilganda, faqat ko'rsatilgan matn bo'lagi topilgan satrlar (bizning holimizda bitta qator) ko'rsatiladi.


O'zgartirish buyrug'i bayrog'idan foydalanish p

Matnni qayta ishlash natijalarini faylga saqlash imkonini beruvchi w bayrog'idan foydalanamiz:

$ sed "s/test/boshqa test/w chiqishi" mening faylim


Matnni qayta ishlash natijalarini faylga saqlash

Ko'rinib turibdiki, buyruqning ishlashi davomida ma'lumotlar STDOUT ga chiqariladi, ishlov berilgan satrlar esa w dan keyin nomi ko'rsatilgan faylga yoziladi.

Ajratuvchi belgilar

/etc/passwd faylida /bin/bash ni /bin/csh bilan almashtirishni tasavvur qiling. Vazifa unchalik qiyin emas:

$ sed "s/\/bin\/bash/\/bin\/csh/" /etc/passwd
Biroq, bu juda yaxshi ko'rinmaydi. Gap shundaki, to'g'ridan-to'g'ri chiziq chizig'i ajratuvchi belgilar sifatida ishlatilganligi sababli, sed ga uzatilgan satrlardagi bir xil belgilardan qochish kerak. Natijada, buyruqning o'qilishi yomonlashadi.

Yaxshiyamki, sed bizga almashtirish buyrug'ida foydalanish uchun o'z chegaralovchi belgilarimizni aniqlash imkonini beradi. Ajratuvchi s dan keyin paydo bo'ladigan birinchi belgidir:

$ sed "s!/bin/bash!/bin/csh!" /etc/passwd
Bunday holda, undov belgisi ajratuvchi sifatida ishlatiladi, natijada kodni o'qish osonroq va avvalgidan ko'ra ancha toza ko'rinadi.

Qayta ishlash uchun matn qismlarini tanlash

Hozirgacha biz muharrirga uzatilgan barcha ma'lumotlar oqimini qayta ishlash uchun sed ni chaqirdik. Ba'zi hollarda, sed yordamida siz matnning faqat bir qismini - ma'lum bir qator yoki qatorlar guruhini qayta ishlashingiz kerak. Ushbu maqsadga erishish uchun siz ikkita yondashuvdan foydalanishingiz mumkin:
  • Ishlov beriladigan qatorlar soniga chek qo'ying.
  • Tegishli satrlari qayta ishlanishi kerak bo'lgan filtrni belgilang.
Keling, birinchi yondashuvni ko'rib chiqaylik. Bu erda ikkita mumkin bo'lgan variant mavjud. Birinchisi, quyida muhokama qilinadi, qayta ishlanishi kerak bo'lgan bir qatorning sonini ko'rsatishni o'z ichiga oladi:

$sed "2s/test/boshqa test/" mening faylim


Faqat bitta satrga ishlov berish, sedga qo'ng'iroq qilishda ko'rsatilgan raqam

Ikkinchi variant qatorlar qatoridir:

$ sed "2.3s/test/boshqa test/" mening faylim


Bir qator qatorlarni qayta ishlash

Bundan tashqari, fayl ma'lum bir satrdan oxirigacha qayta ishlanishi uchun almashtirish buyrug'ini chaqirishingiz mumkin:

$ sed "2,$s/test/boshqa test/" mening faylim


Faylni ikkinchi qatordan oxirigacha qayta ishlash

Faqat berilgan filtrga mos keladigan satrlarni qayta ishlash uchun almashtirish buyrug'idan foydalanish uchun buyruq quyidagicha chaqirilishi kerak:

$ sed "/likegeeks/s/bash/csh/" /etc/passwd
Yuqorida muhokama qilingan narsalarga o'xshab, shablon s buyruq nomidan oldin o'tkaziladi.


Filtrga mos keladigan qatorlarni qayta ishlash

Bu erda biz juda oddiy filtrdan foydalandik. Ushbu yondashuvning imkoniyatlaridan to'liq foydalanish uchun siz oddiy iboralardan foydalanishingiz mumkin. Biz ular haqida ushbu seriyadagi quyidagi materiallardan birida gaplashamiz.

Qatorlarni olib tashlash

Sed yordam dasturi faqat satrlardagi belgilar ketma-ketligini boshqasi bilan almashtirish uchun foydalidir. Uning yordami bilan, ya'ni d buyrug'i yordamida siz matn oqimidan satrlarni o'chirishingiz mumkin.

Buyruqning chaqiruvi quyidagicha ko'rinadi:

$sed "3D" mening faylim
Biz uchinchi qatorni matndan olib tashlashni xohlaymiz. E'tibor bering, bu fayl emas. Fayl o'zgarishsiz qoladi, o'chirish faqat sed tomonidan yaratilgan chiqishga ta'sir qiladi.


Uchinchi qatorni olib tashlash

Agar d buyrug'ini chaqirayotganda o'chirish uchun qator raqamini ko'rsatmasangiz, oqimdagi barcha satrlar o'chiriladi.

Bir qator qatorlarga d buyrug'ini qanday qo'llash mumkin:

$sed "2,3d" mening faylim


Bir qator qatorlarni o'chirish

Berilganidan boshlab faylning oxirigacha bo'lgan qatorlarni qanday o'chirish mumkin:

$sed "3,$d" faylim


Fayl oxirigacha satrlarni o'chirish

Qatorlar quyidagi naqsh yordamida ham o'chirilishi mumkin:

$ sed "/test/d" mening faylim


Naqsh yordamida qatorlarni olib tashlash

d ga qo'ng'iroq qilganda siz naqsh juftligini belgilashingiz mumkin - naqsh paydo bo'lgan chiziqlar va ular orasidagi chiziqlar o'chiriladi:

$ sed "/ikkinchi/,/to'rtinchi/d" mening faylim


Joker belgilar yordamida qatorlar qatorini olib tashlash

Oqimga matn kiritish

sed bilan i va buyruqlar yordamida matn oqimiga ma'lumotlarni kiritishingiz mumkin:
  • i buyrug'i berilganidan oldin yangi qator qo'shadi.
  • a buyrug'i berilgandan keyin yangi qator qo'shadi.
i buyrug'idan foydalanish misolini ko'rib chiqamiz:

$ echo "Yana bir sinov" | sed "i\Birinchi test"


Jamoa i

Endi a buyrug'ini ko'rib chiqamiz:

$ echo "Yana bir sinov" | sed "a\Birinchi test"


Buyruq a

Ko'rib turganingizdek, bu buyruqlar oqimdagi ma'lumotlardan oldin yoki keyin matn qo'shadi. Agar o'rtada biron bir chiziq qo'shish kerak bo'lsa-chi?

Bu erda bizga oqim yoki shablondagi mos yozuvlar qatori raqamini ko'rsatish yordam beradi. Shuni esda tutingki, satrlarga diapazon sifatida murojaat qilish bu erda ishlamaydi. Yangi qatorni kiritishingiz kerak bo'lgan qator raqamini ko'rsatgan holda i buyrug'iga qo'ng'iroq qiling:

$ sed "2i\Bu kiritilgan qator." mening faylim


Yo'naltiruvchi qator raqami bilan i buyrug'i

a buyrug'i bilan ham xuddi shunday qilamiz:

$ sed "2a\Bu qo'shilgan qator." mening faylim


Yo'naltiruvchi qator raqami bilan a buyrug'i

i va a buyruqlari qanday ishlashidagi farqga e'tibor bering. Birinchisi ko'rsatilganidan oldin yangi qatorni qo'yadi, ikkinchisi - undan keyin.

Iplarni almashtirish

c buyrug'i ma'lumotlar oqimidagi matnning butun qatori tarkibini o'zgartirishga imkon beradi. Unga qo'ng'iroq qilishda siz oqimga yangi ma'lumotlar qo'shilishi kerak bo'lgan qator raqamini ko'rsatishingiz kerak:

$ sed "3c\Bu o'zgartirilgan qator." mening faylim


Butun qatorni almashtirish

Agar siz buyruqni chaqirayotganda oddiy matn yoki oddiy ifoda ko'rinishidagi naqshdan foydalansangiz, naqshga mos keladigan barcha satrlar almashtiriladi:

$ sed "/This is/c Bu matnning oʻzgartirilgan qatori." mening faylim


Naqsh yordamida satrlarni almashtirish

Belgilarni almashtirish

Y buyrug'i alohida belgilar bilan ishlaydi, ularni chaqirilganda unga uzatilgan ma'lumotlarga ko'ra almashtiradi:

$sed "y/123/567/" mening faylim


Belgilarni almashtirish

Ushbu buyruqdan foydalanganda, u butun matn oqimiga taalluqliligini hisobga olishingiz kerak, uni belgilarning muayyan hodisalari bilan cheklab bo'lmaydi.

Satr raqamlari ko'rsatilmoqda

Agar siz = buyrug'i yordamida sed ga qo'ng'iroq qilsangiz, yordamchi dastur ma'lumotlar oqimidagi qator raqamlarini chop etadi:

$sed "=" mening faylim


Satr raqamlari ko'rsatilmoqda

Oqim muharriri ularning mazmunidan oldin qator raqamlarini ko'rsatdi.

Agar siz ushbu buyruqqa naqsh o'tkazsangiz va sed -n kalitidan foydalansangiz, faqat naqshga mos keladigan qator raqamlari chop etiladi:

$ sed -n "/test/=" mening faylim


Naqshga mos keladigan qator raqamlarini chop etish

Fayldan qo'shish ma'lumotlarini o'qish

Yuqorida biz sed ga qo'ng'iroq qilishda to'g'ridan-to'g'ri nima kiritish kerakligini ko'rsatib, oqimga ma'lumotlarni kiritish usullarini ko'rib chiqdik. Bundan tashqari, ma'lumot manbai sifatida fayldan foydalanishingiz mumkin. Buning uchun r buyrug'idan foydalaning, bu sizga ko'rsatilgan fayldan ma'lumotlarni oqimga kiritish imkonini beradi. Unga qo'ng'iroq qilishda siz fayl tarkibini yoki naqshni kiritmoqchi bo'lgan qator raqamini belgilashingiz mumkin.

Keling, bir misolni ko'rib chiqaylik:

$sed "3r yangi fayl" mening faylim


Fayl tarkibini oqimga kiritish

Bu yerda yangi fayl faylining mazmuni myfile faylining uchinchi qatoridan keyin kiritilgan.

Agar siz r buyrug'ini chaqirganda naqsh ishlatsangiz, shunday bo'ladi:

$ sed "/test/r newfile" mening faylim


r buyrug'ini chaqirganda joker belgidan foydalanish

Fayl mazmuni naqshga mos keladigan har bir qatordan keyin kiritiladi.

Misol

Keling, bunday vazifani tasavvur qilaylik. Bitta fayl mavjud bo'lib, unda ma'lum bir belgilar ketma-ketligi mavjud bo'lib, u o'z-o'zidan ma'nosiz, uni boshqa fayldan olingan ma'lumotlar bilan almashtirish kerak. Ya'ni, DATA belgilar ketma-ketligi to'ldiruvchi rolini o'ynaydigan yangi fayl fayli bo'lsin. DATA o'rniga almashtirilishi kerak bo'lgan ma'lumotlar ma'lumotlar faylida saqlanadi.

Ushbu muammoni sed oqim muharririning r va d buyruqlari yordamida hal qilishingiz mumkin:

$ Sed "/DATA>/ ( r yangi fayl d)" mening faylim


To'ldiruvchini haqiqiy ma'lumotlar bilan almashtirish

Ko'rib turganingizdek, DATA to'ldiruvchisi o'rniga sed ma'lumotlar faylidan chiqish oqimiga ikkita qator qo'shdi.

Natijalar

Bugun biz sed oqim muharriri bilan ishlash asoslarini ko'rib chiqdik. Aslida, sed juda katta mavzu. Uni o'rganishni yangi dasturlash tilini o'rganish bilan solishtirish mumkin, ammo asoslarni tushunganingizdan so'ng, sedni o'zingizga kerak bo'lgan istalgan darajada o'rganishingiz mumkin. Natijada, u bilan matnlarni qayta ishlash qobiliyatingiz faqat sizning tasavvuringiz bilan cheklanadi.

Bugun uchun hammasi shu. Keyingi safar awk ma'lumotlarni qayta ishlash tili haqida gaplashamiz.

Hurmatli kitobxonlar! Kundalik ishingizda sed dan foydalanasizmi? Ha bo'lsa, tajribangizni o'rtoqlashing.

Oxirgi marta biz bash skriptlaridagi funktsiyalar, xususan, ularni buyruq satridan qanday chaqirish haqida gapirgan edik. Bizning bugungi mavzuimiz qatorli ma'lumotlarni qayta ishlash uchun juda foydali vosita - sed deb nomlangan Linux yordam dasturi. Ko'pincha jurnal fayllari, konfiguratsiya va boshqa fayllar ko'rinishidagi matnlar bilan ishlash uchun ishlatiladi.



Agar siz bash skriptlarida har qanday ma'lumotlarni manipulyatsiya qilmoqchi bo'lsangiz, sed va gawk vositalari bilan tanishishni xohlaysiz. Bu erda biz sed va matnlar bilan ishlashga e'tibor qaratamiz, chunki bu bizning bash skriptini ishlab chiqishning keng doiralari bo'ylab sayohatimizdagi juda muhim qadamdir.

Endi biz sed bilan ishlash asoslarini ko'rib chiqamiz, shuningdek, ushbu vositadan foydalanishning o'ndan ortiq misollarini ko'rib chiqamiz.

sed bilan ishlash asoslari

sed yordam dasturi oqimli matn muharriri deb ataladi. Nano kabi interaktiv matn muharrirlarida siz klaviatura yordamida matnlar bilan ishlaysiz, fayllarni tahrirlaysiz, matnlarni qo'shasiz, o'chirasiz yoki o'zgartirasiz. Sed sizga ishlab chiquvchi tomonidan belgilangan qoidalar to'plami asosida ma'lumotlar oqimini tahrirlash imkonini beradi. Bu buyruq qanday ko'rinishga ega:

$sed variantlar fayli
Odatiy bo'lib, sed chaqirilganda belgilangan buyruqlar to'plami sifatida ifodalangan qoidalarni STDIN ga qo'llaydi. Bu sizga ma'lumotlarni to'g'ridan-to'g'ri sed-ga o'tkazish imkonini beradi.

Masalan, bu kabi:

$ echo "Bu sinov" | sed "s/test/boshqa test/"
Ushbu buyruqni bajarganingizda shunday bo'ladi.


sed chaqirishning oddiy misoli

Bunday holda, sed qayta ishlashga o'tgan qatordagi "test" so'zini "boshqa test" so'zlari bilan almashtiradi. Qo'shtirnoq ichiga olingan matnni qayta ishlash qoidasini shakllantirish uchun oldinga qiyshiq chiziqlar qo'llaniladi. Bizning holatlarimizda biz s/pattern1/pattern2/ kabi buyruqdan foydalandik. "S" harfi "almashtirish" so'zining qisqartmasi, ya'ni bizda almashtirish buyrug'i mavjud. Sed, ushbu buyruqni bajarib, uzatilgan matnni ko'rib chiqadi va undagi bo'laklarni (qaysi biri haqida quyida gaplashamiz) shablon2 bilan almashtiradi.

Yuqorida sizni tezlashtirish uchun sed dan foydalanishning ibtidoiy misoli keltirilgan. Aslida, sed fayllar bilan ishlash kabi matnni qayta ishlashning ancha murakkab stsenariylarida ishlatilishi mumkin.

Quyida matnning bir qismi va uni ushbu buyruq yordamida qayta ishlash natijalarini o'z ichiga olgan fayl mavjud:

$ sed "s/test/boshqa test" ./myfile


Matn fayli va uni qayta ishlash natijalari

Bu yuqorida biz ishlatgan yondashuvdan foydalanadi, ammo endi sed faylda saqlangan matnni qayta ishlaydi. Biroq, agar fayl etarlicha katta bo'lsa, sed ma'lumotlarni bo'laklarga bo'lib qayta ishlashini va butun faylning qayta ishlanishini kutmasdan, ekranda ishlov berilgan narsalarni ko'rsatishini sezasiz.

Sed qayta ishlayotgan fayldagi ma'lumotlarni o'zgartirmaydi. Tahrirlovchi faylni o'qiydi, u o'qiganini qayta ishlaydi va natijani STDOUTga yuboradi. Manba fayl o'zgarmaganligiga ishonch hosil qilish uchun uni sed-ga o'tkazilgandan so'ng ochish kifoya. Agar kerak bo'lsa, sed chiqishi faylga yo'naltirilishi mumkin, ehtimol eski faylni qayta yozish. Agar siz kirish va chiqish oqimlarini qayta yo'naltirish bilan bog'liq bo'lgan ushbu seriyadagi oldingilaridan biri bilan tanish bo'lsangiz, buni amalga oshirishingiz kerak.

sed ga qo'ng'iroq qilishda buyruqlar to'plamini bajarish

Ma'lumotlarda bir nechta amallarni bajarish uchun sed ga qo'ng'iroq qilishda -e tugmasidan foydalaning. Masalan, ikkita matn bo'lagini almashtirishni qanday tashkil qilish kerak:

$ sed -e "s/Bu/Bu/; s/test/boshqa test/" ./myfile


Sedga qo'ng'iroq qilishda -e tugmasidan foydalanish

Ikkala buyruq ham fayldagi matnning har bir satriga qo'llaniladi. Ular nuqtali vergul bilan ajratilishi kerak va buyruq oxiri bilan nuqtali vergul o'rtasida bo'sh joy qolmasligi kerak.
Sed ga qo'ng'iroq qilishda bir nechta matnni qayta ishlash naqshlarini kiritish uchun siz birinchi bitta qo'shtirnoqni kiritganingizdan so'ng Enter tugmasini bosishingiz va har bir qoidani yangi qatorga kiritishingiz mumkin, bunda yopilish tirnoqini unutmang:

$ sed -e " > s/Bu/Bu/ > s/test/boshqa test/" ./myfile
Bu shaklda berilgan buyruq bajarilgandan keyin sodir bo'ladi.


sed bilan ishlashning yana bir usuli

Fayldan buyruqlarni o'qish

Agar sizda matnni qayta ishlash uchun ishlatilishi kerak bo'lgan juda ko'p sed buyruqlari bo'lsa, ularni faylga oldindan yozib qo'yganingiz ma'qul. Buyruqlarni o'z ichiga olgan sed faylini belgilash uchun -f tugmasidan foydalaning:

Mana mycommands faylining mazmuni:

S/Bu/Bu/ s/test/boshqa test/
Muharrirga buyruqlar va ishlov berish uchun faylni uzatib, sed deb nomlaymiz:

$ sed -f mening faylim buyruqlari
Bunday buyruqni chaqirishda natija oldingi misollarda olingan natijaga o'xshaydi.


Sed ga qo'ng'iroq qilishda buyruq faylidan foydalanish

Buyruq bayroqlarini almashtiring

Quyidagi misolni diqqat bilan ko'rib chiqing.

$sed "s/test/boshqa test/" mening faylim
Bu faylda mavjud bo'lgan va sed uni qayta ishlagandan keyin olinadigan narsa.


Manba fayli va uni qayta ishlash natijalari

O'zgartirish buyrug'i odatda ko'p qatorli faylni boshqaradi, lekin har bir satrda qidirilayotgan matnning faqat birinchi holatlari almashtiriladi. Naqshning barcha holatlarini almashtirish uchun siz tegishli bayroqdan foydalanishingiz kerak.

Bayroqlardan foydalanishda almashtirish buyrug'ini yozish sxemasi quyidagicha ko'rinadi:

S/naqsh/almashtirish/bayroqlar
Ushbu buyruqning bajarilishi bir necha usul bilan o'zgartirilishi mumkin.

  • Raqamni uzatishda satrda naqsh paydo bo'lishining seriya raqami hisobga olinadi va aynan shu hodisa almashtiriladi.
  • g bayrog'i satrdagi naqshning barcha holatlarini qayta ishlash kerakligini ko'rsatadi.
  • p bayrog'i asl satr tarkibini chop etish kerakligini bildiradi.
  • w fayl bayrog'i matnni qayta ishlash natijalarini faylga yozish buyrug'ini bildiradi.
Kerakli fragmentning almashtirilgan paydo bo'lish o'rnini ko'rsatib, almashtirish buyrug'ining birinchi versiyasidan foydalanishni ko'rib chiqaylik:

$ sed "s/test/boshqa test/2" mening faylim

O'zgartirilishi kerak bo'lgan fragmentning o'rnini ko'rsatuvchi almashtirish buyrug'ini chaqirish

Bu erda biz 2 raqamini almashtirish bayrog'i sifatida ko'rsatdik.Bu har bir satrda kerakli naqshning faqat ikkinchi marta takrorlanishiga olib keldi. Endi global almashtirish bayrog'ini sinab ko'raylik - g:

$ sed "s/test/boshqa test/g" mening faylim
Chiqarish natijalaridan ko'rinib turibdiki, bunday buyruq matndagi naqshning barcha holatlarini almashtirdi.


Global almashtirish

almashtirish buyrug'i bayrog'i p sizga mos keladigan satrlarni chop etishga imkon beradi, sed ga qo'ng'iroq qilishda ko'rsatilgan -n opsiyasi esa oddiy chiqishni bostiradi:

$ sed -n "s/test/boshqa test/p" mening faylim
Natijada, ushbu konfiguratsiyada sed ishga tushirilganda, faqat ko'rsatilgan matn bo'lagi topilgan satrlar (bizning holimizda bitta qator) ko'rsatiladi.


O'zgartirish buyrug'i bayrog'idan foydalanish p

Matnni qayta ishlash natijalarini faylga saqlash imkonini beruvchi w bayrog'idan foydalanamiz:

$ sed "s/test/boshqa test/w chiqishi" mening faylim


Matnni qayta ishlash natijalarini faylga saqlash

Ko'rinib turibdiki, buyruqning ishlashi davomida ma'lumotlar ga chiqariladi, ishlov berilgan satrlar esa w dan keyin nomi ko'rsatilgan faylga yoziladi.

Ajratuvchi belgilar

/etc/passwd faylida /bin/bash ni /bin/csh bilan almashtirishni tasavvur qiling. Vazifa unchalik qiyin emas:

$ sed "s/\/bin\/bash/\/bin\/csh/" /etc/passwd
Biroq, bu juda yaxshi ko'rinmaydi. Gap shundaki, to'g'ridan-to'g'ri chiziq chizig'i ajratuvchi belgilar sifatida ishlatilganligi sababli, sed ga uzatilgan satrlardagi bir xil belgilardan qochish kerak. Natijada, buyruqning o'qilishi yomonlashadi.

Yaxshiyamki, sed bizga almashtirish buyrug'ida foydalanish uchun o'z chegaralovchi belgilarimizni aniqlash imkonini beradi. Ajratuvchi s dan keyin paydo bo'ladigan birinchi belgidir:

$ sed "s!/bin/bash!/bin/csh!" /etc/passwd
Bunday holda, undov belgisi ajratuvchi sifatida ishlatiladi, natijada kodni o'qish osonroq va avvalgidan ko'ra ancha toza ko'rinadi.

Qayta ishlash uchun matn qismlarini tanlash

Hozirgacha biz muharrirga uzatilgan barcha ma'lumotlar oqimini qayta ishlash uchun sed ni chaqirdik. Ba'zi hollarda, sed yordamida siz matnning faqat bir qismini - ma'lum bir qator yoki qatorlar guruhini qayta ishlashingiz kerak. Ushbu maqsadga erishish uchun siz ikkita yondashuvdan foydalanishingiz mumkin:
  • Ishlov beriladigan qatorlar soniga chek qo'ying.
  • Tegishli satrlari qayta ishlanishi kerak bo'lgan filtrni belgilang.
Keling, birinchi yondashuvni ko'rib chiqaylik. Bu erda ikkita mumkin bo'lgan variant mavjud. Birinchisi, quyida muhokama qilinadi, qayta ishlanishi kerak bo'lgan bir qatorning sonini ko'rsatishni o'z ichiga oladi:

$sed "2s/test/boshqa test/" mening faylim


Faqat bitta satrga ishlov berish, sedga qo'ng'iroq qilishda ko'rsatilgan raqam

Ikkinchi variant qatorlar qatoridir:

$ sed "2.3s/test/boshqa test/" mening faylim


Bir qator qatorlarni qayta ishlash

Bundan tashqari, fayl ma'lum bir satrdan oxirigacha qayta ishlanishi uchun almashtirish buyrug'ini chaqirishingiz mumkin:

$ sed "2,$s/test/boshqa test/" mening faylim


Faylni ikkinchi qatordan oxirigacha qayta ishlash

Faqat berilgan filtrga mos keladigan satrlarni qayta ishlash uchun almashtirish buyrug'idan foydalanish uchun buyruq quyidagicha chaqirilishi kerak:

$ sed "/likegeeks/s/bash/csh/" /etc/passwd
Yuqorida muhokama qilingan narsalarga o'xshab, shablon s buyruq nomidan oldin o'tkaziladi.


Filtrga mos keladigan qatorlarni qayta ishlash

Bu erda biz juda oddiy filtrdan foydalandik. Ushbu yondashuvning imkoniyatlaridan to'liq foydalanish uchun siz oddiy iboralardan foydalanishingiz mumkin. Biz ular haqida ushbu seriyadagi quyidagi materiallardan birida gaplashamiz.

Qatorlarni olib tashlash

Sed yordam dasturi faqat satrlardagi belgilar ketma-ketligini boshqasi bilan almashtirish uchun foydalidir. Uning yordami bilan, ya'ni d buyrug'i yordamida siz matn oqimidan satrlarni o'chirishingiz mumkin.

Buyruqning chaqiruvi quyidagicha ko'rinadi:

$sed "3D" mening faylim
Biz uchinchi qatorni matndan olib tashlashni xohlaymiz. E'tibor bering, bu fayl emas. Fayl o'zgarishsiz qoladi, o'chirish faqat sed tomonidan yaratilgan chiqishga ta'sir qiladi.


Uchinchi qatorni olib tashlash

Agar d buyrug'ini chaqirayotganda o'chirish uchun qator raqamini ko'rsatmasangiz, oqimdagi barcha satrlar o'chiriladi.

Bir qator qatorlarga d buyrug'ini qanday qo'llash mumkin:

$sed "2,3d" mening faylim


Bir qator qatorlarni o'chirish

Berilganidan boshlab faylning oxirigacha bo'lgan qatorlarni qanday o'chirish mumkin:

$sed "3,$d" faylim


Fayl oxirigacha satrlarni o'chirish

Qatorlar quyidagi naqsh yordamida ham o'chirilishi mumkin:

$ sed "/test/d" mening faylim


Naqsh yordamida qatorlarni olib tashlash

d ga qo'ng'iroq qilganda siz naqsh juftligini belgilashingiz mumkin - naqsh paydo bo'lgan chiziqlar va ular orasidagi chiziqlar o'chiriladi:

$ sed "/ikkinchi/,/to'rtinchi/d" mening faylim


Joker belgilar yordamida qatorlar qatorini olib tashlash

Oqimga matn kiritish

sed bilan i va buyruqlar yordamida matn oqimiga ma'lumotlarni kiritishingiz mumkin:
  • i buyrug'i berilganidan oldin yangi qator qo'shadi.
  • a buyrug'i berilgandan keyin yangi qator qo'shadi.
i buyrug'idan foydalanish misolini ko'rib chiqamiz:

$ echo "Yana bir sinov" | sed "i\Birinchi test"


Jamoa i

Endi a buyrug'ini ko'rib chiqamiz:

$ echo "Yana bir sinov" | sed "a\Birinchi test"


Buyruq a

Ko'rib turganingizdek, bu buyruqlar oqimdagi ma'lumotlardan oldin yoki keyin matn qo'shadi. Agar o'rtada biron bir chiziq qo'shish kerak bo'lsa-chi?

Bu erda bizga oqim yoki shablondagi mos yozuvlar qatori raqamini ko'rsatish yordam beradi. Shuni esda tutingki, satrlarga diapazon sifatida murojaat qilish bu erda ishlamaydi. Yangi qatorni kiritishingiz kerak bo'lgan qator raqamini ko'rsatgan holda i buyrug'iga qo'ng'iroq qiling:

$ sed "2i\Bu kiritilgan qator." mening faylim


Yo'naltiruvchi qator raqami bilan i buyrug'i

a buyrug'i bilan ham xuddi shunday qilamiz:

$ sed "2a\Bu qo'shilgan qator." mening faylim


Yo'naltiruvchi qator raqami bilan a buyrug'i

i va a buyruqlari qanday ishlashidagi farqga e'tibor bering. Birinchisi ko'rsatilganidan oldin yangi qatorni qo'yadi, ikkinchisi - undan keyin.

Iplarni almashtirish

c buyrug'i ma'lumotlar oqimidagi matnning butun qatori tarkibini o'zgartirishga imkon beradi. Unga qo'ng'iroq qilishda siz oqimga yangi ma'lumotlar qo'shilishi kerak bo'lgan qator raqamini ko'rsatishingiz kerak:

$ sed "3c\Bu o'zgartirilgan qator." mening faylim


Butun qatorni almashtirish

Agar siz buyruqni chaqirayotganda oddiy matn yoki oddiy ifoda ko'rinishidagi naqshdan foydalansangiz, naqshga mos keladigan barcha satrlar almashtiriladi:

$ sed "/This is/c Bu matnning oʻzgartirilgan qatori." mening faylim


Naqsh yordamida satrlarni almashtirish

Belgilarni almashtirish

Y buyrug'i alohida belgilar bilan ishlaydi, ularni chaqirilganda unga uzatilgan ma'lumotlarga ko'ra almashtiradi:

$sed "y/123/567/" mening faylim


Belgilarni almashtirish

Ushbu buyruqdan foydalanganda, u butun matn oqimiga taalluqliligini hisobga olishingiz kerak, uni belgilarning muayyan hodisalari bilan cheklab bo'lmaydi.

Satr raqamlari ko'rsatilmoqda

Agar siz = buyrug'i yordamida sed ga qo'ng'iroq qilsangiz, yordamchi dastur ma'lumotlar oqimidagi qator raqamlarini chop etadi:

$sed "=" mening faylim


Satr raqamlari ko'rsatilmoqda

Oqim muharriri ularning mazmunidan oldin qator raqamlarini ko'rsatdi.

Agar siz ushbu buyruqqa naqsh o'tkazsangiz va sed -n kalitidan foydalansangiz, faqat naqshga mos keladigan qator raqamlari chop etiladi:

$ sed -n "/test/=" mening faylim


Naqshga mos keladigan qator raqamlarini chop etish

Fayldan qo'shish ma'lumotlarini o'qish

Yuqorida biz sed ga qo'ng'iroq qilishda to'g'ridan-to'g'ri nima kiritish kerakligini ko'rsatib, oqimga ma'lumotlarni kiritish usullarini ko'rib chiqdik. Bundan tashqari, ma'lumot manbai sifatida fayldan foydalanishingiz mumkin. Buning uchun r buyrug'idan foydalaning, bu sizga ko'rsatilgan fayldan ma'lumotlarni oqimga kiritish imkonini beradi. Unga qo'ng'iroq qilishda siz fayl tarkibini yoki naqshni kiritmoqchi bo'lgan qator raqamini belgilashingiz mumkin.

Keling, bir misolni ko'rib chiqaylik:

$sed "3r yangi fayl" mening faylim


Fayl tarkibini oqimga kiritish

Bu yerda yangi fayl faylining mazmuni myfile faylining uchinchi qatoridan keyin kiritilgan.

Agar siz r buyrug'ini chaqirganda naqsh ishlatsangiz, shunday bo'ladi:

$ sed "/test/r newfile" mening faylim


r buyrug'ini chaqirganda joker belgidan foydalanish

Fayl mazmuni naqshga mos keladigan har bir qatordan keyin kiritiladi.

Misol

Keling, bunday vazifani tasavvur qilaylik. Bitta fayl mavjud bo'lib, unda ma'lum bir belgilar ketma-ketligi mavjud bo'lib, u o'z-o'zidan ma'nosiz, uni boshqa fayldan olingan ma'lumotlar bilan almashtirish kerak. Ya'ni, DATA belgilar ketma-ketligi to'ldiruvchi rolini o'ynaydigan yangi fayl fayli bo'lsin. DATA o'rniga almashtirilishi kerak bo'lgan ma'lumotlar ma'lumotlar faylida saqlanadi.

Ushbu muammoni sed oqim muharririning r va d buyruqlari yordamida hal qilishingiz mumkin:

$ Sed "/DATA>/ ( r yangi fayl d)" mening faylim


To'ldiruvchini haqiqiy ma'lumotlar bilan almashtirish

Ko'rib turganingizdek, DATA to'ldiruvchisi o'rniga sed ma'lumotlar faylidan chiqish oqimiga ikkita qator qo'shdi.

Natijalar

Bugun biz sed oqim muharriri bilan ishlash asoslarini ko'rib chiqdik. Aslida, sed juda katta mavzu. Uni o'rganishni yangi dasturlash tilini o'rganish bilan solishtirish mumkin, ammo asoslarni tushunganingizdan so'ng, sedni o'zingizga kerak bo'lgan istalgan darajada o'rganishingiz mumkin. Natijada, u bilan matnlarni qayta ishlash qobiliyatingiz faqat sizning tasavvuringiz bilan cheklanadi.

Bugun uchun hammasi shu. Keyingi safar awk ma'lumotlarni qayta ishlash tili haqida gaplashamiz.

Hurmatli kitobxonlar! Kundalik ishingizda sed dan foydalanasizmi? Ha bo'lsa, tajribangizni o'rtoqlashing.

Sed engil (ikkilik atigi 128 kilobaytni tashkil qiladi) va matnni qayta ishlash uchun qulay vositadir.

Ushbu maqolada men foydalanishning oddiy misollarini keltiraman sed va uning asosiy imkoniyatlari haqida gapirib bering.

Sed kirish oqimini yoki faylni satr bo'yicha oladi, har bir satrni sed skriptida belgilangan qoidalarga muvofiq tahrirlaydi va keyin natijani chiqaradi. Sed - bu Turingning to'liq dasturlash tili.

sed buyruq formati

sed buyrug'i quyidagi formatga ega:

sed [ -n ] [ -e skripti ] [ -f skript fayli ] [ fayllar ]

Bayroq -n chiqishni bostiradi
-e- buyruq satrida berilgan ko'rsatmalar ro'yxatiga ishora qiladi.
-f- skript faylining joylashishini bildiradi.

Buyruq formatini tahrirlash

Skript fayli buyruqlar to'plamidan iborat:

[ manzil [ , manzil ] ] buyrug'i [ argumentlar ]

har bir satrda bittadan.
Manzillar qator raqamlari, maxsus belgilar yoki oddiy ifodadir:

$ - oxirgi qator
boshlash ~ N- Har biri N-sondan boshlanadigan qator Boshlash
/muntazam ifoda/- muntazam_ifoda ostidagi qatorlar
Misollar:

1~2 - Har ikkinchi qator /REGEXP/- u sodir bo'lgan barcha chiziqlar /REGEXP/ 10,20 - 10 dan 20 gacha bo'lgan qatorlar 10,+10 - 10 dan 20 gacha bo'lgan qatorlar 5,~N- 5-dan boshlab va birinchi martagacha bo'lgan qatorlar N 5,/REGEXP/- o'z ichiga olgan qatorlar /REGEXP/, 5-dan keyin (5-chidan tashqari)
  • Agar manzil ko'rsatilmagan bo'lsa, barcha satrlar qayta ishlanadi.
  • Agar bitta manzil ko'rsatilgan bo'lsa, tegishli qatorga ishlov beriladi
  • Agar ikkita manzil ko'rsatilgan bo'lsa, u holda belgilangan oraliqdagi chiziqlar tanlanadi.
  • !jamoa- bajarilgan jamoa, manzil bo'yicha tanlanmagan qatorlar uchun.

Asosiy buyruqlar

Keling, asosiy buyruqlarni ko'rib chiqaylik:

[manzil] matn- belgilangan satrdan keyin matnli yangi qator qo'shing

$ cat sed_test sed_test_1 11111 sed_test_2 22222 sed_test_3 33333 $ sed -e "2 a new_line" sed_test sed_test_1 11111 sed_test_2 22222 new_line sed_test_3 33333

[manzil [, manzil]] c matn- Tanlangan chiziqlarni olib tashlaydi va ularni o'rniga qo'yadi matn

$ sed -e "2 new_line" sed_test sed_test_1 11111 new_line sed_test_3 33333 $ sed -e "/3/ with new_line" sed_test sed_test_1 11111 sed_test_2 22222 new_line

[manzil [, manzil]] d- Belgilangan qatorlarni o'chiradi.

$ sed -e "2 d" sed_test sed_test_1 11111 sed_test_3 33333 $ sed -e "2!d" sed_test sed_test_2 22222

[manzil] men matn yozaman- Kiritmoq matn belgilangan qator o'rniga.

$ sed -e "2 i new_line" sed_test sed_test_1 11111 new_text sed_test_2 22222 sed_test_3 33333

[manzil [, manzil]] p(bayroq bilan -n) topilgan satrlarni ko'rsatadi.

$ sed -ne "2p" sed_test sed_test_2 22222

[manzil]q- sed dan chiqish.

[manzil [, manzil]] r fayl- O'qiyapti fayl va uning mazmunini chiqaradi.

[manzil [, manzil]] s/regex/almashtirish/bayroqlar- almashtiradi muntazam ifoda yoqilgan almashtirish- bayroqlarni hisobga olgan holda:

  • g - butun qatorda
  • i - katta-kichik harflar sezilmaydi
  • p - almashtirish natijasini ko'rsatish
$ sed -ne "s/t/T/g" sed_test sed_TesT_1 11111 sed_TesT_2 22222 sed_TesT_3 33333 $ sed -e "s//d/g" sed_test sed_test_d ddddd sed_test_d test ddddddddd

[manzil [, manzil]] y/1-satr/2-qator/- Belgilarning barcha takrorlanishini almashtiradi qator 1 dan tegishli belgilar chiziqlar 2. Chiziqlarning uzunligi bir xil bo'lishi kerak.

$ sed -ne "y/est/EST/g" sed_test SEd_TEST_1 11111 SEd_TEST_2 22222 SEd_TEST_3 33333

[manzil[,manzil]] (buyruqlar)- qavslar guruhi buyruqlari
[manzil] =- Qator raqamlarini beradi

Teglar

: yorliq- buyruqlar guruhiga moslash yorliq
b yorlig'i yorliq, Agar yorliq yo'q, keyin buyruq faylining oxiriga o'ting.

t yorlig'i- yorliqda ko'rsatilgan buyruqqa o'ting yorliq faqat buyruq yordamida muvaffaqiyatli almashtirilgandan so'ng s///

Amalga oshirish tsikli

sed ikkita ma'lumot buferi bilan ishlaydi: asosiy va yordamchi. Dastlab ikkala bufer ham bo'sh.
Bu buferlar bilan ishlash buyruqlar yordamida amalga oshiriladi:\\`h`, `H`, `x`, `g`, `G``D` h- Yordamchi bufer tarkibini asosiysi bilan almashtiring
H- Yordamchi buferga yangi qator qo'shing va keyin asosiy bufer tarkibini yordamchi tarkibga qo'shing.
x- Ikkala buferning tarkibini almashtiring
g- Asosiy bufer tarkibini yordamchining tarkibi bilan almashtiring
G- Asosiy buferga yangi qator qo'shing va keyin yordamchi bufer tarkibini asosiy bufer tarkibiga qo'shing
D- Asosiy bufer matnini keyingi yangi qator belgisigacha o'chiring
N- Asosiy buferga yangi qator qo'shing, so'ngra u erda qayta ishlanadigan keyingi qatorni qo'shing
P- Asosiy bufer tarkibini keyingi yangi satr belgisigacha chop eting.

Keyinchalik murakkab misollar

Quyidagi skript fayl satrlarini almashtiradi (birinchi qatorlar oxirgi va aksincha)

$ cat tac.sed #!/usr/bin/sed -nf # ikkinchi qatordan boshlab, joriy satrga buferning mazmuni (oldingi # barcha oldingi qatorlarni o'z ichiga olgan) qo'shiladi. 1! G # oxirgi qatorga yetganda - chop etish $ p # Ma'lumotlarni buferga yana yozing h sed -nf tac.sed sed_test sed_test_3 33333 sed_test_2 22222 sed_test_1 11111

Biz faylning satrlarini hisoblaymiz (biz oxirgi qatorning raqamini ko'rsatamiz)

$ cat count.sed #!/usr/bin/sed -nf $=

natija

$ sed -nf count.sed sed_test 3

String teskari

$ cat revers.sed #!/usr/bin/sed -f # bitta harfdan iborat qatorlarni o'tkazib yuboring /../! b # Satrni teskari aylantiring. Joriydan oldin va keyin bo'sh qator qo'shing. s/%$@~*!G4;:%#`.*$/\ &\ / # Birinchi belgini oxirigacha ko'chiring # o'rta chiziqda belgilar mavjud ekan, tsikl ishlaydi. tx:x s/\(\\n.\)\(.*\)\(.\\n\)/\\3\\2\\1/ tx #keraksiz qator uzilishlarini olib tashlash s/\\n// g

Ushbu skript bir vaqtning o'zida ikkita harfni ko'chiradi.

$ sed -f revers.sed sed_test 11111 1_tset_des 22222 2_tset_des 33333 3_tset_des

qo'shimcha ma'lumot

Qo'llanmani o'qib, sed skriptlarining formati haqida ko'proq bilib olishingiz mumkin man sed yoki texnik hujjatlar ma'lumot sed.


Muallif: Rares Aioanei
Nashr qilingan sana: 2011 yil 19 noyabr
Tarjimasi: A. Krivoshey
Tarjima sanasi: 2012 yil iyul

Nikolay Ignatushko ushbu maqolada keltirilgan barcha buyruqlarni Gentoo tarqatishda GNU sed 4.2.1 versiyasida sinab ko'rdi. GNU sed versiyasida hamma skriptlar yaxshi ishlamadi. Ammo bu tuzatilgan kichik narsalar masalasi edi. Faqat tepalikni tog'lar bilan almashtirish yozuvini sezilarli darajada o'zgartirish kerak edi.

1.Kirish

Seriyamizning sed, GNU versiyasidagi ikkinchi qismiga xush kelibsiz. Turli platformalarda mavjud bo'lgan sedning bir nechta versiyalari mavjud, ammo biz GNU sed 4.x versiyasiga e'tibor qaratamiz. Ko'pchiligingiz sed haqida eshitgansiz yoki uni almashtirish vositasi sifatida ishlatgansiz. Ammo bu sedning maqsadlaridan faqat biri va biz sizga ushbu yordam dasturidan foydalanishning barcha jihatlarini ko'rsatishga harakat qilamiz. Uning nomi "Stream Editor" degan ma'noni anglatadi va bu holda "oqim" so'zi faylni, kanalni yoki oddiygina stdinni anglatishi mumkin. Umid qilamizki, siz allaqachon Linux bo'yicha asosiy bilimga egasiz va agar siz allaqachon oddiy iboralar bilan ishlagan bo'lsangiz yoki hech bo'lmaganda ular nima ekanligini bilsangiz, siz uchun hamma narsa ancha oson bo'ladi. Space bizga muntazam iboralar bo'yicha to'liq qo'llanmani kiritishga imkon bermaydi; buning o'rniga biz asosiy tushunchalarni yoritamiz va sed dan qanday foydalanish haqida ko'plab misollar keltiramiz.

2. O'rnatish

Bu erda ko'p gapirishning hojati yo'q. Ehtimol, sizda barcha sed o'rnatilgan, chunki u turli xil tizim skriptlari, shuningdek, unumdorligini oshirishni xohlaydigan Linux foydalanuvchilari tomonidan qo'llaniladi. Siz sed ning qaysi versiyasini o'rnatganingizni buyruq bilan bilib olishingiz mumkin:

$sed --versiyasi

Tizimda bu buyruq menda GNU sed 4.2.1 o'rnatilganligini, shuningdek, dasturning bosh sahifasiga havola va boshqa foydali ma'lumotlar borligini ko'rsatadi. Paket taqsimlanishidan qat'i nazar, "sed" deb ataladi, Gentoodan tashqari, u bilvosita mavjud bo'lgan joyda.

3. Tushunchalar

Yana davom etishdan oldin, “sed” nima qilayotganiga e’tibor qaratish muhim, deb o‘ylaymiz, chunki “oqim muharriri” iborasi uning maqsadi haqida ko‘p gapirmaydi. sed matnni kiritish sifatida qabul qiladi, har bir satrda belgilangan amallarni bajaradi (agar boshqacha ko'rsatilmagan bo'lsa) va o'zgartirilgan matnni chiqaradi. Belgilangan operatsiyalar qo'shish, kiritish, o'chirish yoki almashtirish bo'lishi mumkin. Bu ko'rinadigan darajada oson emas: ogohlantiring, sed buyrug'ini tushunish juda qiyin bo'lishi mumkin bo'lgan ko'plab variantlar va variantlar kombinatsiyasi mavjud. Shuning uchun, qanday ishlashini tushunish uchun muntazam iboralar asoslarini o'rganishingizni tavsiya qilamiz. O'quv qo'llanmasini boshlashdan oldin, biz Erik Pement va boshqalarga ilhom va sedni o'rganish va undan foydalanishni istagan har bir kishi uchun qilgan ishlari uchun minnatdorchilik bildiramiz.

4. Muntazam iboralar

Sed buyruqlari (skriptlar) ko'pchilik uchun sir bo'lib qolayotganligi sababli, bizning o'quvchilarimiz ma'nosini tushunmaydigan buyruqlarni ko'r-ko'rona nusxalash va joylashtirishdan ko'ra asosiy tushunchalarni tushunishlari kerak deb hisoblaymiz. Muntazam iboralar nima ekanligini tushunmoqchi bo'lganida, kalit so'z "moslik", aniqrog'i, "naqsh moslashuvi" bo'ladi. Misol uchun, sizning bo'limingiz uchun hisobotda siz tarmoq me'moriga ishora qilib, Nik ismini yozdingiz. Ammo Nik ketdi va uning o'rniga Jon keldi, shuning uchun endi Nik so'zini Jon bilan almashtirishingiz kerak. Agar hisobot fayli report.txt deb nomlangan bo'lsa, siz quyidagi buyruqni bajarishingiz kerak:

$ cat report.txt | sed "s/Nick/John/g" > report_new.txt

Odatiy bo'lib sed stdout dan foydalanadi, yuqoridagi misolda ko'rsatilganidek, chiqishni qayta yo'naltirish operatoridan foydalanishingiz mumkin. Bu juda oddiy misol, lekin biz bir nechta fikrlarni ko'rsatamiz: biz "Nik" naqshiga barcha mos keladiganlarni qidiramiz va ularni barcha holatlarda "Jon" bilan almashtiramiz. E'tibor bering, sed qidiruvlari katta-kichik harflarga sezgir, shuning uchun ehtiyot bo'ling va barcha almashtirishlar amalga oshirilganligiga ishonch hosil qilish uchun chiqish faylini tekshiring. Yuqoridagi misolni quyidagicha yozish mumkin:

$ sed "s/Nick/John/g" report.txt > report_new.txt

Mayli, deyishingiz mumkin, lekin muntazam iboralar qayerda? Ha, biz birinchi navbatda misol ko'rsatmoqchi edik va endi qiziqarli qism.
Agar siz "nik" yoki "Nik" deb yozganingizga ishonchingiz komil bo'lmasa va ikkala holatni ham qamrab olishni istasangiz, "s/Nick|nick/John/g" buyrug'idan foydalanishingiz kerak. Vertikal chiziq siz C tilini o'rganganligingizni bilishingiz kerak bo'lgan ma'noga ega, ya'ni sizning ifodangiz "nik" yoki "Nik" ga mos keladi. Quyida ko'rib turganingizdek, kanal boshqa yo'llar bilan ishlatilishi mumkin, ammo ma'no bir xil bo'lib qoladi. Oddiy iboralarda tez-tez ishlatiladigan boshqa operatorlar "?", oldingi belgining takroriga nol yoki bir marta mos keladi (ya'ni, lazzat va lazzat mos keladi), "*" - nol yoki undan ko'p marta, "+" - bir yoki bir necha marta. "^" satr boshiga mos keladi, "$" esa aksincha. Agar siz vi yoki vim foydalanuvchisi bo'lsangiz, ko'p narsalar sizga tanish bo'lib tuyuladi. Axir, bu yordamchi dasturlar awk va C bilan birga UNIX ning dastlabki kunlariga qaytadi. Biz bu mavzu haqida ko'proq gapirmaymiz, chunki bu belgilarning ma'nosini misollar bilan tushunish osonroq, lekin shuni bilishingiz kerakki, muntazam iboralarning turli xil ilovalari mavjud: POSIX, POSIX Extended, Perl, shuningdek, loyqa muntazamning turli xil ilovalari bosh og'rig'iga olib kelishi kafolatlangan ifodalar.

5. Sed dan foydalanishga misollar

Buyruqlar sintaksisi Tavsif

Sed "s/Nick/John/g" report.txt

report.txt faylida Nikning har bir takrorlanishini Jon bilan almashtiradi

Sed "s/Nick\|nick/John/g" report.txt

Nik yoki nikning har bir hodisasini Jon bilan almashtiradi.

Sed "s/^/ /" file.txt > file_new.txt

Chop etish sifatini yaxshilash uchun matnning chap tomoniga 8 ta boʻsh joy qoʻshadi.

Sed -n "/Albatta/,/e'tibor siz to'laysiz/p" myfile

"Albatta" bilan boshlanib, "E'tibor qaratasiz" bilan tugaydigan barcha paragraflarni ko'rsatadi.

Sed -n 12.18p fayl.txt

file.txt faylining faqat 12-18 qatorlarini chiqaradi

Sed 12,18d file.txt

12-18-qatorlardan tashqari butun file.txt faylini chop etadi
file.txt faylidagi har bir satrdan keyin bo'sh qator qo'yadi

Sed -f script.sed file.txt

Barcha buyruqlarni script.sed ga yozadi va ularni bajaradi.

Sed "5!s/ham/cheese/" file.txt

file.txt faylida jambonni pishloq bilan almashtiradi, 5-qatordan tashqari

“$d” fayl.txt

Oxirgi qatorni olib tashlaydi

Sed -n "/\(3\)/p" fayl.txt

Faqat ketma-ket uchta raqamdan iborat qatorlarni chop etadi

Sed "/boom/s/aaa/bb/" fayl.txt

Agar "boom" topilsa, aaa ni bb bilan almashtiring

Sed "17,/disk/d" fayl.txt

17-qatordan boshlab "disk" ga qadar barcha qatorlarni o'chiradi. Agar "disk" bilan bir nechta qatorlar bo'lsa, ulardan birinchisigacha o'chiriladi.

Echo ONE IKKI | sed "s/one/unos/I"

Birini unos bilan almashtiradi, shuning uchun u "unos TWO" ni chop etadi

Sed "G;G" fayl.txt

file.txt faylida har bir satrdan keyin ikkita bo'sh qator qo'yadi

Sed "s/.$//" file.txt

dos2unixni almashtirish usuli :). Umuman olganda, har bir satrdagi oxirgi belgini olib tashlaydi.

Sed "s/^[ \t]*//" file.txt

file.txt faylidagi har bir satr oldidagi barcha boʻshliqlarni/yorliqlarni olib tashlaydi

Sed "s/[ \t]*$//" file.txt

file.txt faylidagi har bir satr oxiridagi barcha bo'shliqlar/yorliqlarni olib tashlaydi

Sed "s/^[ \t]*//;s/[ \t]*$//" file.txt

file.txt faylidagi har bir satrning boshida va oxiridagi barcha bo'shliqlarni/yorliqlarni olib tashlaydi

Sed "s/foo/bar/" file.txt

Foo ni bar bilan faqat qatorning birinchi paydo bo'lishida almashtiradi.

Sed "s/foo/bar/4" file.txt

Foo ni bar bilan faqat qatorning to'rtinchi takrorida almashtiradi.

Sed "s/foo/bar/g" fayl.txt

Satrning barcha holatlari uchun foo ni bar bilan almashtiradi.

Sed "/baz/s/foo/bar/g" fayl.txt

Foo ni bar bilan almashtiring, agar satrda baz bo'lsa.

Sed "/./,/^$/!d" file.txt

Barcha ketma-ket bo'sh qatorlarni bittaga siqib chiqaring. Yuqori qismida bo'sh qator yo'q.

Sed "/^$/N;/\n$/D" fayl.txt

Barcha ketma-ket bo'sh satrlarni bittaga to'plang, lekin yuqoridagi bo'sh qatorni qoldiring.

Sed "/./,$!d" file.txt

Barcha oldingi bo'sh qatorlarni olib tashlang

Sed -e:a -e "/^\n*$/($d;N;);/\n$/ba" fayl.txt

Barcha keyingi bo'sh qatorlarni olib tashlang

Sed -e:a -e "/\\$/N; s/\\\n/ /; ta" file.txt

Agar chiziq orqa chiziq bilan tugasa, uni keyingisi bilan birlashtiring (qobiq skriptlari uchun foydali)

Sed -n "/regex/,+5p" fayl.txt

Regexni o'z ichiga olgan qatordan keyin 5 qatorni chop etadi

Sed "1~3d" fayl.txt

Birinchisidan boshlab har uchinchi qatorni o'chiring.

Sed -n "2~5p" fayl.txt

Ikkinchidan boshlab har beshinchi qatorni chop eting.

Sed "s/ick/John/g" report.txt

Yuqoridagi misollarni yozishning yana bir usuli. O'zingizni taklif qila olasizmi?

Sed -n "/RE/(p;q;)" fayl.txt

Birinchi RE (muntazam ifoda) mosligi bilan chiziqni chop etadi

Sed "0,/RE/(//d;)" fayl.txt

Birinchi mos keladigan satrni olib tashlaydi

Sed "0,/RE/s//to_that/" file.txt

Faqat birinchi o'yinni o'zgartiradi

Sed "s/^[^,]*,/9999,/" file.csv

CSV faylining birinchi ustunidagi barcha qiymatlarni 9999 bilan almashtiradi

S/^ *\(.*[^ ]\) *$/|\1|/; s/" *, */"|/g; : loop s/| *\([^",|][^,|]*\) *, */|\1|/g; s/| *, */||/g; t tsikli s/ *|/|/g ; s/| */|/g; s/^|\(.*\)|$/\1/;

Sed skripti CSV faylni quvur chegaralagichi bo'lgan faylga aylantirish uchun (faqat ba'zi CSV turlari, o'rnatilgan tirnoq va vergullar bilan ishlaydi).

Sed ":a;s/\(^\|[^0-9.]\)\(\+\)\(\(3\)\)/\1\2,\3/g;ta" fayli .Xabar

file.txt faylidagi raqam formatini 1234.56 dan 1.234.56 ga oʻzgartiradi

Sed -r "s/\<(reg|exp)+/\U&/g"

Reg yoki exp bilan boshlangan har qanday so‘zni bosh harfga o‘zgartiradi.

Sed "1.20 s/Johnson/White/g" file.txt

Jonsonni faqat 1 - 20 qatorlarda Oq bilan almashtiradi.

Sed "1.20 !s/Johnson/White/g" fayl.txt

Oldingi misol teskari (1-20 qatorlardan tashqari hamma joyda almashtiriladi)

Sed "/from/,/until/ ( s/\<red\>/magenta/g; s/<blue\>/cyan/g; )" fayl.txt

Faqat "dan" va "quncha" o'rtasida almashtiriladi. Agar bir nechta "dan"-"gacha" maydonlar bo'lsa, ularning har birida almashtiriladi.

Sed "/ENDNOTES:/,$ ( s/Schaff/Herzog/g; s/Kraft/Ebbing/g; )" fayl.txt

Faqat "SOXIRGI SO'ZLAR:" so'zidan EOF ga almashtiriladi

Sed "/./(H;$!d;);x;/regex/!d" fayl.txt

Paragrafni faqat regex bo'lsa chop etadi

Sed -e "/./(H;$!d;)" -e "x;/RE1/!d;/RE2/!d;/RE3/!d" fayl.txt

Paragraflarni faqat ularda RE1, RE2 va RE3 bo'lsa chop etadi. RE1, RE2 va RE3 tartibi muhim emas.

Sed "s/14"/o'n to'rt dyuym/g" fayl.txt

Shu tarzda siz qo'sh tirnoqlardan foydalanishingiz mumkin

Sed "s/\/some\/UNIX\/path/\/a\/new\/path/g" file.txt

Unix Paths bilan ishlash

Sed "s///g" fayl.txt

file.txt faylidan a bilan boshlangan va g bilan tugaydigan barcha belgilarni olib tashlaydi

Sed "s/\(.*\)foo/\1bar/" file.txt

Satrdagi foo ning faqat oxirgi mosligini bar bilan almashtiradi

Sed "1!G;h;$!d"

Tac buyrug'ini almashtirish

Sed "/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//"

Rev buyrug'ini almashtirish

Sed 10q file.txt

Bosh buyrug'ini almashtirish

Sed -e:a -e "$q;N;11,$D;ba" fayl.txt

Quyruq buyrug'ini almashtirish

Sed "$!N; /^\(.*\)\n\1$/!P; D" file.txt

Uniq buyrug'ini almashtirish

Sed "$!N; s/^\(.*\)\n\1$/\1/;t; D" fayl.txt

Teskari buyruq (uniq -d ga ekvivalent)

Sed "$!N;$!D" fayl.txt

Quyruq -n 2 ga teng

Sed -n "$p" fayl.txt

... quyruq -n 1 (yoki quyruq -1)

Sed "/regexp/!d" file.txt

grepga teng

Sed -n "/regexp/(g;1!p;);h" fayl.txt

Muntazam iboraning birinchi mos kelishidan oldingi qatorni chop qiladi, lekin moslikni o'zi qo'shmaydi

Sed -n "/regexp/(n;p;)" fayl.txt

Birinchi oddiy ibora mos kelganidan keyin qatorni chop etadi, lekin moslikni o'zi qo'shmaydi

Sed "/pattern/d" fayl.txt

Naqshga mos keladigan chiziqlarni olib tashlaydi

Sed "/./!d" file.txt

Fayldan barcha bo'sh qatorlarni olib tashlaydi

Sed "/^$/N;/\n$/N;//D" fayl.txt

Barcha ketma-ket bo'sh qatorlarni ikkita bo'sh qatorga qisqartiradi. Yagona bo'sh qatorlar o'zgartirilmaydi.

Sed -n "/^$/(p;h;);/./(x;/./p;)" file.txt

Har bir paragrafning oxirgi qatorini olib tashlaydi
Xabar sarlavhasini oladi. Boshqacha qilib aytganda, u birinchi bo'sh qatordan keyin hamma narsani o'chiradi.