susuzluk
Adı susuzluk için kısa akış düzenleyici. Bir metin akışı üzerinde, ya bir dizi belirlenmiş dosya ya da standart girdi üzerinde metin düzenlemesi gerçekleştirir. susuzluk güçlü ve biraz karmaşık bir programdır (bununla ilgili bütün kitaplar vardır), bu yüzden burada tamamen ele almayacağız.
Genel olarak, yol susuzluk ya tek bir düzenleme komutu (komut satırında) ya da birden çok komut içeren bir komut dosyası adının verilmesi ve daha sonra bu komutları metin akışındaki her satırda gerçekleştirmesidir. İşte çok basit bir örnek susuzluk eylemde:
[ben@linuxbox ~]$ yankı "ön" | sed 's/ön/arka/'
Arka
[ben@linuxbox ~]$ yankı "ön" | sed 's/ön/arka/'
Arka
Bu örnekte, yankı kullanarak tek kelimelik bir metin akışı üretiyoruz ve onu susuzluk. susuzluk, sırayla, talimatı yerine getirir s/ön/arka/ akıştaki metnin üzerine ve sonuç olarak "geri" çıktısını üretir. Bu komutu aynı zamanda "değiştirme" (ara ve değiştir) komutuna benzetebiliriz. vi.
içindeki komutlar susuzluk tek harfle başla. Yukarıdaki örnekte, ikame komutu harf ile temsil edilmektedir. s ve ardından, sınırlayıcı olarak eğik çizgi karakteriyle ayrılan ara ve değiştir dizeleri gelir. Sınırlayıcı karakterin seçimi keyfidir. Geleneksel olarak, eğik çizgi karakteri sıklıkla kullanılır, ancak susuzluk komutu hemen izleyen herhangi bir karakteri sınırlayıcı olarak kabul eder. Aynı komutu şu şekilde de uygulayabiliriz:
[ben@linuxbox ~]$ yankı "ön" | sed 's_front_back_'
Arka
[ben@linuxbox ~]$ yankı "ön" | sed 's_front_back_'
Arka
Komuttan hemen sonra alt çizgi karakteri kullanılarak sınırlayıcı olur. Sınırlayıcıyı ayarlama yeteneği, göreceğimiz gibi komutları daha okunabilir kılmak için kullanılabilir.
Çoğu komut susuzluk öncesinde olabilir adres, giriş akışının hangi satır(lar)ının düzenleneceğini belirtir. Adres atlanırsa, düzenleme komutu car-
giriş akışındaki her satırda çıktı. En basit adres biçimi bir satır numarasıdır. Örneğimize bir tane ekleyebiliriz:
[ben@linuxbox ~]$ yankı "ön" | sed '1s/ön/arka/'
Arka
[ben@linuxbox ~]$ yankı "ön" | sed '1s/ön/arka/'
Arka
adres ekleme 1 komutumuza, ikamemizin tek satırlık giriş akışımızın ilk satırında yapılmasına neden olur. Başka bir sayı belirtirsek:
[ben@linuxbox ~]$ yankı "ön" | sed '2s/ön/arka/'
ön
[ben@linuxbox ~]$ yankı "ön" | sed '2s/ön/arka/'
ön
Giriş akışımızda 2 satır olmadığı için düzenleme yapılmadığını görüyoruz. Adresler birçok şekilde ifade edilebilir. İşte en yaygın olanları:
Tablo 20-7: sed Adres Gösterimi
Adres Bilgileri
Adres Bilgileri
n Bir satır numarası nerede n pozitif bir tamsayıdır.
![]()
$ Son satır.
![]()
/regexp/ Bir POSIX temel normal ifadesiyle eşleşen satırlar. Normal ifadenin eğik çizgi karakterleriyle sınırlandırıldığını unutmayın. İsteğe bağlı olarak, normal ifade ile ifade belirtilerek alternatif bir karakterle sınırlandırılabilir. \Cregexpc, Burada c alternatif karakterdir.
![]()
adres1,adres2 gelen bir dizi satır adres1 için adres2, dahil. Adresler, yukarıdaki tek adres formlarından herhangi biri olabilir.
![]()
ilk~adım Sayı ile temsil edilen çizgiyi eşleştirin ilk, ardından sonraki her satırda adım aralıklar. Örneğin 1~2, tek numaralı her satıra, 5~5 beşinci satıra ve ondan sonraki her beşinci satıra atıfta bulunur.
![]()
adres1,+n Maç adres1 ve aşağıdaki n çizgiler.
![]()
adr! dışındaki tüm satırları eşleştir adr, yukarıdaki formlardan herhangi biri olabilir.
![]()
kullanarak farklı türde adresler göstereceğiz. dağıtımlar.txt daha önceki dosya
bu bölümde. İlk olarak, bir dizi satır numarası:

[ben@linuxbox ~]$ sed -n '1,5p' dağıtımlar.txt
SUSE 10.2 12/07/2006
Fedora 10 11
SUSE 11.0 06/19/2008
Ubuntu 8.04 04/24/2008
Fedora 8 11
Bu örnekte, 1. satırdan başlayıp 5. satıra kadar devam eden bir dizi satır yazdırıyoruz. p sadece eşleşen bir satırın yazdırılmasına neden olan komut. Ancak bunun etkili olması için, seçeneği eklemeliyiz. -n (otomatik yazdırma yok seçeneği) neden olur susuzluk varsayılan olarak her satırı yazdırmamak için.
Ardından, normal bir ifade deneyeceğiz:
[ben@linuxbox ~]$ | sed -n '/SUSE/p' dağıtımları.txt |
SUSE 10.2 | 12/07/2006 |
SUSE 11.0 | 06/19/2008 |
SUSE 10.3 | 10/04/2007 |
SUSE 10.1 | 05/11/2006 |
Eğik çizgiyle ayrılmış normal ifadeyi ekleyerek /SUSE/, onu içeren satırları aynı şekilde izole edebiliyoruz. grep.
Son olarak, bir ünlem işareti ekleyerek olumsuzlamayı deneyeceğiz (!) adresine:
[ben@linuxbox ~]$ | sed -n '/SUSE/!p' distros.txt |
Fedora 10 | 11/25/2008 |
Ubuntu 8.04 | 04/24/2008 |
Fedora 8 | 11/08/2007 |
Ubuntu 6.10 | 10/26/2006 |
Fedora 7 | 05/31/2007 |
Ubuntu 7.10 | 10/18/2007 |
Ubuntu 7.04 | 04/19/2007 |
Fedora 6 | 10/24/2006 |
Fedora 9 | 05/13/2008 |
Ubuntu 6.06 | 06/01/2006 |
Ubuntu 8.10 | 10/30/2008 |
Fedora 5 | 03/20/2006 |
Burada beklenen sonucu görüyoruz: dosyadaki tüm satırlar, eşleşenler hariç.
Düzenli ifade.
Şimdiye kadar, iki tanesine baktık. susuzluk düzenleme komutları, s ve p. İşte temel düzenleme komutlarının daha eksiksiz bir listesi:
Tablo 20-8: sed Temel Düzenleme Komutları
Komut Açıklaması
Komut Açıklaması
= Çıkış akımı satır numarası.
![]()
a Geçerli satırdan sonra metin ekleyin.
![]()
d Geçerli satırı silin.
![]()
i Geçerli satırın önüne metin ekleyin.
![]()
p Geçerli satırı yazdırın. Varsayılan olarak, sed her satırı yazdırır ve yalnızca dosya içinde belirtilen adresle eşleşen satırları düzenler. Varsayılan davranış, -n seçeneği belirtilerek geçersiz kılınabilir.
![]()
q Çıkış susuzluk daha fazla satır işlemeden. Eğer
-n seçeneği belirtilmemiş, mevcut satırın çıktısını alın.
![]()
Q Çıkış susuzluk daha fazla satır işlemeden.
![]()
s/regexp/değiştirme/ içeriğini değiştir değiştirme her nerede
regexp bulunan. değiştirme özel karakter içerebilir &ile eşleşen metne eşdeğer olan regexp. Ek olarak, değiştirme dizileri içerebilir \1 içinden \9içinde karşılık gelen alt ifadelerin içerikleri olan regexp. Bununla ilgili daha fazla bilgi için bkz. geri referanslar aşağıda. Aşağıdaki eğik çizgiden sonra değiştirme, değiştirmek için isteğe bağlı bir bayrak belirtilebilir. s komutun davranışı.
![]()
y/set1/set2 Karakterleri dönüştürerek harf çevirisi gerçekleştirin set1 karşılık gelen karakterlere set2. Aksine unutmayın tr, susuzluk her iki kümenin de aynı uzunlukta olmasını gerektirir.
![]()
The s komutu açık ara en yaygın kullanılan düzenleme komutudur. Sayfamızda bir düzenleme yaparak gücünün sadece bir kısmını göstereceğiz. dağıtımlar.txt dosya. Tarih alanının nasıl olduğunu daha önce tartışmıştık. dağıtımlar.txt için “bilgisayar dostu” değildi-
mat. Tarih AA/GG/YYYY biçiminde olsa da (sıralama kolaylığı açısından) biçimin YYYY-AA-GG şeklinde olması daha iyi olurdu. Dosya üzerinde bu değişikliği elle gerçekleştirmek hem zaman alıcı hem de hataya açık olacaktır, ancak susuzluk, bu değişiklik tek adımda gerçekleştirilebilir:

[ben@linuxbox ~]$ sed 's/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\
)$/\3-\1-\2/' dağıtımlar.txt
SUSE 10.2 2006-12-07
Fötr 10 2008-11-25
SUSE 11.0 2008-06-19
Ubuntu 8.04 2008-04-24
Fötr 8 2007-11-08
SUSE 10.3 2007-10-04
Ubuntu 6.10 2006-10-26
Fötr 7 2007-05-31
Ubuntu 7.10 2007-10-18
Ubuntu 7.04 2007-04-19
SUSE 10.1 2006-05-11
Fötr 6 2006-10-24
Fötr 9 2008-05-13
Ubuntu 6.06 2006-06-01
Ubuntu 8.10 2008-10-30
Fötr 5 2006-03-20
Vay! Şimdi bu çirkin görünen bir komut. Ama işe yarıyor. Sadece bir adımda dosyamızdaki tarih formatını değiştirdik. Aynı zamanda, normal ifadelerin bazen şaka yollu "salt yazılır" ortam olarak adlandırılmasına da mükemmel bir örnektir. Bunları yazabiliriz ama bazen okuyamayız. Bu komuttan dehşet içinde kaçmaya kalkışmadan önce, nasıl yapıldığına bir bakalım. İlk olarak, komutun şu temel yapıya sahip olacağını biliyoruz:
sed'ler/regexp/değiştirme/' dağıtımlar.txt
sed'ler/regexp/değiştirme/' dağıtımlar.txt
Bir sonraki adımımız, tarihi izole edecek bir düzenli ifade bulmak. AA/GG/YYYY formatında olduğu ve satırın sonunda göründüğü için şöyle bir ifade kullanabiliriz:
[0-9]{2}/[0-9]{2}/[0-9]{4}$
[0-9]{2}/[0-9]{2}/[0-9]{4}$
iki basamak, eğik çizgi, iki basamak, eğik çizgi, dört basamak ve satır sonu ile eşleşen. Böylece ilgilenir regexp, ama ne hakkında değiştirme? Bunu halletmek için tanıtmalıyız
BRE kullanan bazı uygulamalarda görünen yeni bir normal ifade özelliği. Bu özellik denir geri referanslar ve şöyle çalışır: Eğer dizi \n içinde görünür yenisiyle değiştirme nerede n 1'den 9'a kadar bir sayıysa, dizi önceki normal ifadedeki karşılık gelen alt ifadeye atıfta bulunacaktır. Alt ifadeleri oluşturmak için bunları parantez içine almamız yeterlidir:
([0-9]{2})/([0-9]{2})/([0-9]{4})$
([0-9]{2})/([0-9]{2})/([0-9]{4})$
Şimdi üç alt ifademiz var. Birincisi ayı, ikincisi ayın gününü ve üçüncüsü yılı içerir. Şimdi inşa edebiliriz değiştirme aşağıdaki gibidir:
\3-\1-\2
\3-\1-\2
bu da bize yılı, kısa çizgiyi, ayı, kısa çizgiyi ve günü verir. Şimdi komutumuz şuna benziyor:
sed 's/([0-9]{2})/([0-9]{2})/([0-9]{4})$/\3-\1-\2/' distros.txt
sed 's/([0-9]{2})/([0-9]{2})/([0-9]{4})$/\3-\1-\2/' distros.txt
Geriye kalan iki sorunumuz var. Birincisi, normal ifademizdeki fazladan eğik çizgilerin kafa karıştıracak olmasıdır. susuzluk yorumlamaya çalıştığında s emretmek. İkincisi, o zamandan beri susuzluk, varsayılan olarak yalnızca temel normal ifadeleri kabul eder, normal ifademizdeki bazı karakterler meta karakterler yerine değişmez değerler olarak alınır. Bu sorunların her ikisini de, rahatsız edici karakterlerden kaçmak için serbest bir ters eğik çizgi uygulamasıyla çözebiliriz:
sed 's/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/' dis tros.txt
sed 's/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/' dis tros.txt
İşte buyur!
Başka bir özelliği s komut, değiştirme dizesini izleyebilecek isteğe bağlı bayrakların kullanılmasıdır. Bunlardan en önemlisi, g talimat veren bayrak susuzluk ara ve değiştir işlevini yalnızca varsayılan olan ilk örneğe değil, genel olarak bir satıra uygulamak. İşte bir örnek:
[ben@linuxbox ~]$ yankı "aabbbccc" | sed 's/b/B/'
aaabbccc
[ben@linuxbox ~]$ yankı "aabbbccc" | sed 's/b/B/'
aaabbccc
Değiştirmenin yapıldığını görüyoruz, ancak yalnızca “b” harfinin ilk örneğine kadar, kalan örnekler değişmeden kaldı. ekleyerek g flag, tüm örnekleri değiştirebiliriz:
[ben@linuxbox ~]$ yankı "aabbbccc" | sed 's/b/B/g'
aaaBBBBcc
[ben@linuxbox ~]$ yankı "aabbbccc" | sed 's/b/B/g'
aaaBBBBcc
Şimdiye kadar sadece verdik susuzluk komut satırı aracılığıyla tek komutlar. Bir komut dosyasında daha karmaşık komutlar oluşturmak da mümkündür. -f seçenek. Göstermek için kullanacağız susuzluk bizimle dağıtımlar.txt Bir rapor oluşturmak için dosya. Raporumuzun başında bir başlık, değiştirilme tarihlerimiz ve büyük harfe dönüştürülmüş tüm dağıtım adları yer alacaktır. Bunu yapmak için bir komut dosyası yazmamız gerekecek, bu nedenle metin düzenleyicimizi çalıştıracağız ve aşağıdakileri gireceğiz:
# sed komut dosyası Linux dağıtımları raporu üretmek için
1 ben\
\
Linux Dağıtımları Raporu\
s/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/ y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
# sed komut dosyası Linux dağıtımları raporu üretmek için
1 ben\
\
Linux Dağıtımları Raporu\
s/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/ y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
bizimkini kurtaracağız susuzluk olarak komut dosyası dağıtılmış.sed ve şu şekilde çalıştırın:

[ben@linuxbox ~]$ sed -f dağıtımlar.sed dağıtımlar.txt
Linux Dağıtımları Raporu
SUSE | 10.2 | 2006-12-07 |
FEDORA | 10 | 2008-11-25 |
SUSE | 11.0 | 2008-06-19 |
UBUNTU | 8.04 | 2008-04-24 |
FEDORA | 8 | 2007-11-08 |
SUSE | 10.3 | 2007-10-04 |
UBUNTU | 6.10 | 2006-10-26 |
FEDORA | 7 | 2007-05-31 |
UBUNTU | 7.10 | 2007-10-18 |
UBUNTU | 7.04 | 2007-04-19 |
SUSE | 10.1 | 2006-05-11 |
FEDORA | 6 | 2006-10-24 |
FEDORA | 9 | 2008-05-13 |
UBUNTU | 6.06 | 2006-06-01 |
UBUNTU | 8.10 | 2008-10-30 |
FEDORA | 5 | 2006-03-20 |
# sed komut dosyası Linux dağıtımları raporu üretmek için
# sed komut dosyası Linux dağıtımları raporu üretmek için
Gördüğümüz gibi, betiğimiz istenen sonuçları veriyor ama bunu nasıl yapıyor? Senaryomuza bir kez daha bakalım. kullanacağız kedi satırları numaralandırmak için:
[ben@linuxbox ~]$ cat -n dağıtım.sed
[ben@linuxbox ~]$ cat -n dağıtım.sed
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8

1 ben\
\
Linux Dağıtımları Raporu\
s/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/ y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
1 ben\
\
Linux Dağıtımları Raporu\
s/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/ y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
Komut dosyamızın birinci satırı bir yorum Yap. Linux sistemlerindeki pek çok yapılandırma dosyası ve programlama dili gibi, yorumlar şu şekilde başlar: # karakter ve ardından insan tarafından okunabilir metin gelir. Yorumlar komut dosyasında herhangi bir yere yerleştirilebilir (komutların kendi içinde olmasa da) ve komut dosyasını tanımlaması ve/veya sürdürmesi gerekebilecek herhangi bir kişi için yararlıdır.
2. satır boş bir satırdır. Yorumlar gibi, okunabilirliği artırmak için boş satırlar eklenebilir.
çok susuzluk komutlar hat adreslerini destekler. Bunlar, girdinin hangi satırlarına göre hareket edileceğini belirtmek için kullanılır. Satır adresleri, tek satır numaraları, satır numarası aralıkları ve son giriş satırını gösteren özel satır numarası “$” olarak ifade edilebilir.
3'ten 6'ya kadar olan satırlar, girişin ilk satırı olan adres 1'e eklenecek metni içerir. NS i komutun ardından, kaçan bir satır başı veya satır devam karakteri. Kabuk komut dosyaları da dahil olmak üzere birçok durumda kullanılabilen bu dizi, yorumlayıcıya sinyal göndermeden bir satırbaşının bir metin akışına gömülmesine izin verir (bu durumda susuzluk) hattın sonuna ulaşıldığını. NS ive aynı şekilde, a (metni eklemek yerine ekler) ve c (metnin yerini alan) komutları, sonuncu hariç her satır bir satır devam karakteriyle bittiği sürece birden çok metin satırına izin verir. Komut dosyamızın altıncı satırı aslında eklediğimiz metnin sonudur ve bir satır devam karakteri yerine düz bir satır başı ile biter, bu da metnin sonunu bildirir. i Komut.
![]()
Not: Bir satır devam karakteri, arkasından bir ters eğik çizgi ile oluşturulur. hemen
bir taşıma dönüşü ile. Ara boşluklara izin verilmez.
![]()
7. satır, ara ve değiştir komutumuzdur. Önünde bir adres olmadığından, giriş akışındaki her satır kendi eylemine tabidir.

Satır 8, küçük harflerin büyük harflere dönüştürülmesini gerçekleştirir. Farklı olduğunu unutmayın tr, y emretmek susuzluk karakter aralıklarını desteklemez (örneğin, [a-z]), POSIX karakter sınıflarını da desteklemez. yana, yine y komuttan önce bir adres gelmez, giriş akışındaki her satır için geçerlidir.
sed'i Beğenenler Şunları da Seviyor...
sed, metin akışlarında oldukça karmaşık düzenleme görevleri gerçekleştirebilen çok yetenekli bir programdır. Genellikle uzun komut dosyaları yerine basit, tek satırlık görevler için kullanılır. Birçok kullanıcı daha büyük görevler için diğer araçları tercih eder. Bunların en popülerleri awk ve perl'dir. Bunlar, burada kapsanan programlar gibi salt araçların ötesine geçer ve eksiksiz programlama dilleri alanına uzanır. Perl, özellikle, birçok sistem yönetimi ve yönetim görevi için kabuk betikleri yerine sıklıkla kullanılır ve ayrıca web geliştirme için çok popüler bir ortamdır. awk biraz daha uzmanlaşmıştır. Özel gücü, tablo verilerini manipüle etme yeteneğidir. Awk programlarının normalde metin dosyalarını satır satır işlemesi, sed bir adres kavramına ve ardından bir eyleme benzer bir şema kullanarak sed'e benzer. Hem awk hem de perl bu kitabın kapsamı dışında olsa da, Linux komut satırı kullanıcısının öğrenmesi için çok iyi becerilerdir.
Dökümanlar