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.
$ 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.
$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.
$ 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.
$ 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.
$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.
$ 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:
- 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
[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. | |