Akış Düzenleyici - Normal İfadeler
SED'yi güçlü ve verimli kılan normal ifadelerdir. Düzenli ifadelerle bir dizi karmaşık görev çözülebilir. Her komut satırı uzmanı, normal ifadelerin gücünü bilir.
Diğer birçok GNU / Linux yardımcı programı gibi, SED de düzenli ifadeleri destekler ve bunlara genellikle regex. Bu bölümde normal ifadeler ayrıntılı olarak açıklanmaktadır. Bu bölüm üç bölüme ayrılmıştır: Standart normal ifadeler, normal ifadelerin POSIX sınıfları ve Meta karakterler.
Standart Normal İfadeler
Satırın başlangıcı (^)
Normal ifadeler terminolojisinde, düzeltme işareti (^) sembolü bir satırın başıyla eşleşir. Aşağıdaki örnek, "The" deseniyle başlayan tüm satırları yazdırır.
[jerry]$ sed -n '/^The/ p' books.txt
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
The Two Towers, J. R. R. Tolkien
The Alchemist, Paulo Coelho
The Fellowship of the Ring, J. R. R. Tolkien
The Pilgrimage, Paulo Coelho
Satır Sonu ($)
Satırın sonu dolar ($) sembolü ile temsil edilir. Aşağıdaki örnek, "Coelho" ile biten satırları yazdırır.
[jerry]$ sed -n '/Coelho$/ p' books.txt
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
The Alchemist, Paulo Coelho
The Pilgrimage, Paulo Coelho
Tek Karakter (.)
Nokta (.), Satır sonu karakteri dışında herhangi bir tek karakterle eşleşir. Aşağıdaki örnek, "t" karakteriyle biten üç harfli kelimelerin tümünü yazdırır.
[jerry]$ echo -e "cat\nbat\nrat\nmat\nbatting\nrats\nmats" | sed -n '/^..t$/p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
cat
bat
rat
mat
Karakter Kümesini Eşleştir ([])
Normal ifade terminolojisinde, bir karakter seti köşeli parantezler ([]) ile temsil edilir. Birkaç karakterden yalnızca birini eşleştirmek için kullanılır. Aşağıdaki örnek, "Çağrı" ve "Uzun" kalıplarıyla eşleşir ancak "Top" ile eşleşmez.
[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[CT]all/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
Call
Tall
Özel Set ([^])
Özel kümede, düzeltme işareti, köşeli parantez içindeki karakter kümesini geçersiz kılar. Aşağıdaki örnek yalnızca "Ball" yazdırır.
[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[^CT]all/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
Ball
Karakter Aralığı ([-])
Bir karakter aralığı sağlandığında, normal ifade köşeli parantez içinde belirtilen aralıktaki herhangi bir karakterle eşleşir. Aşağıdaki örnek, "Ara" ve "Uzun" ile eşleşir ancak "Top" ile eşleşmez.
[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[C-Z]all/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
Call
Tall
Şimdi aralığı "AP" olarak değiştirelim ve sonucu gözlemleyelim.
[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[A-P]all/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
Call
Ball
Bir Durumda Sıfır (\?)
SED'de soru işareti (\?), Sıfır veya önceki karakterin bir oluşumuyla eşleşir. Aşağıdaki örnek, "Davranış" ile "Davranış" ile eşleşmektedir. Burada "\?" Kullanarak isteğe bağlı karakter olarak "u" yaptık.
[jerry]$ echo -e "Behaviour\nBehavior" | sed -n '/Behaviou\?r/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
Behaviour
Behavior
Bir veya Daha Fazla Durum (\ +)
SED'de artı simgesi (\ +), önceki karakterin bir veya daha fazla oluşumuyla eşleşir. Aşağıdaki örnek, "2" nin bir veya daha fazla oluşumuyla eşleşmektedir.
[jerry]$ echo -e "111\n22\n123\n234\n456\n222" | sed -n '/2\+/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
22
123
234
222
Sıfır veya Daha Fazla Oluşum (*)
Yıldız işaretleri (*), önceki karakterin sıfır veya daha fazla oluşumuyla eşleşir. Aşağıdaki örnek, "ca", "cat", "catt" vb. İle eşleşir.
[jerry]$ echo -e "ca\ncat" | sed -n '/cat*/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
ca
cat
Tam Olarak N Oluşum {n}
{n}, önceki karakterin "n" oluşumuyla tam olarak eşleşir. Aşağıdaki örnek yalnızca üç basamaklı sayıları yazdırır. Ancak ondan önce, yalnızca sayıları içeren aşağıdaki dosyayı oluşturmanız gerekir.
[jerry]$ cat numbers.txt
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
1
10
100
1000
10000
100000
1000000
10000000
100000000
1000000000
SED ifadesini yazalım.
[jerry]$ sed -n '/^[0-9]\{3\}$/ p' numbers.txt
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
100
Küme parantezi çiftinin çıkışında "\" karakteri bulunduğunu unutmayın.
En az n Oluşum {n,}
{n,}, önceki karakterin en az "n" oluşumuyla eşleşir. Aşağıdaki örnek, beş basamağa eşit veya büyük olan tüm sayıları yazdırır.
[jerry]$ sed -n '/^[0-9]\{5,\}$/ p' numbers.txt
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
10000
100000
1000000
10000000
100000000
1000000000
M - N Oluşum {m, n}
{m, n}, önceki karakterin en az "m" ve en fazla "n" oluşumuyla eşleşir. Aşağıdaki örnek, en az beş basamaklı ancak sekizden fazla olmayan tüm sayıları yazdırır.
[jerry]$ sed -n '/^[0-9]\{5,8\}$/ p' numbers.txt
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
10000
100000
1000000
10000000
Boru (|)
SED'de dikey çizgi karakteri mantıksal OR işlemi gibi davranır. Borunun her iki tarafındaki öğelerle eşleşir. Aşağıdaki örnek, "str1" veya "str3" ile eşleşir.
[jerry]$ echo -e "str1\nstr2\nstr3\nstr4" | sed -n '/str\(1\|3\)/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
str1
str3
Parantez ve dikey çizgi (|) çiftinin "\" karakteriyle kaçtığına dikkat edin.
Kaçan Karakterler
Bazı özel karakterler var. Örneğin, satırsonu "\ n" ile temsil edilir, satır başı "\ r" ile temsil edilir, vb. Bu karakterleri normal ASCII bağlamında kullanmak için geriye eğik çizgi (\) karakterini kullanarak onlardan çıkış yapmalıyız. Bu bölüm, özel karakterlerin kaçışını gösterir.
"\" Karakterinden çıkış
Aşağıdaki örnek "\" kalıbıyla eşleşmektedir.
[jerry]$ echo 'str1\str2' | sed -n '/\\/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
str1\str2
Çıkış "\ n"
Aşağıdaki örnek, yeni satır karakteriyle eşleşmektedir.
[jerry]$ echo 'str1\nstr2' | sed -n '/\\n/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
str1\nstr2
"\ R" karakterinden çıkış
Aşağıdaki örnek, satır başı ile eşleşir.
[jerry]$ echo 'str1\rstr2' | sed -n '/\\r/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
str1\rstr2
"\ Dnnn" den kaçış
Bu, ondalık ASCII değeri "nnn" olan bir karakterle eşleşir. Aşağıdaki örnek yalnızca "a" karakteriyle eşleşir.
[jerry]$ echo -e "a\nb\nc" | sed -n '/\d97/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
a
"\ Onnn" karakterinden çıkış
Bu, sekizlik ASCII değeri "nnn" olan bir karakterle eşleşir. Aşağıdaki örnek yalnızca "b" karakteriyle eşleşmektedir.
[jerry]$ echo -e "a\nb\nc" | sed -n '/\o142/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
b
Bu, onaltılık ASCII değeri "nnn" olan bir karakterle eşleşir. Aşağıdaki örnek yalnızca "c" karakteriyle eşleşir.
[jerry]$ echo -e "a\nb\nc" | sed -n '/\x63/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
c
Normal İfadelerin POSIX Sınıfları
Özel anlamı olan bazı ayrılmış sözcükler vardır. Bu ayrılmış sözcükler, normal ifadenin POSIX sınıfları olarak adlandırılır. Bu bölüm SED tarafından desteklenen POSIX sınıflarını açıklamaktadır.
[: alnum:]
Alfabetik ve sayısal karakterleri ifade eder. Aşağıdaki örnek yalnızca "Bir" ve "123" ile eşleşir ancak sekme karakteriyle eşleşmez.
[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alnum:]]/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
One
123
[:alfa:]
Yalnızca alfabetik karakterleri ima eder. Aşağıdaki örnek yalnızca "Bir" kelimesiyle eşleşmektedir.
[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alpha:]]/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
One
[:boş:]
Boşluk veya sekme olabilen boş karakter anlamına gelir. Aşağıdaki örnek yalnızca sekme karakteriyle eşleşir.
[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:space:]]/ p' | cat -vte
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
^I$
"Cat -vte" komutunun sekme karakterlerini (^ I) göstermek için kullanıldığına dikkat edin.
[:hane:]
Yalnızca ondalık sayıları ifade eder. Aşağıdaki örnek yalnızca "123" rakamıyla eşleşmektedir.
[jerry]$ echo -e "abc\n123\n\t" | sed -n '/[[:digit:]]/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
123
[: alt:]
Yalnızca küçük harfleri ifade eder. Aşağıdaki örnek yalnızca "bir" ile eşleşmektedir.
[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:lower:]]/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
one
[:üst:]
Yalnızca büyük harfleri ifade eder. Aşağıdaki örnek yalnızca "TWO" ile eşleşmektedir.
[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:upper:]]/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
TWO
[: nokta:]
Boşluk olmayan veya alfanümerik karakterler içeren noktalama işaretlerini ifade eder
[jerry]$ echo -e "One,Two\nThree\nFour" | sed -n '/[[:punct:]]/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
One,Two
[:Uzay:]
Boşluk karakterlerini ifade eder. Aşağıdaki örnek bunu göstermektedir.
[jerry]$ echo -e "One\n123\f\t" | sed -n '/[[:space:]]/ p' | cat -vte
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
123^L^I$
Metakarakterler
Geleneksel normal ifadeler gibi, SED de meta karakterleri destekler. Bunlar Perl tarzı düzenli ifadelerdir. Metakarakter desteğinin GNU SED'e özgü olduğunu ve diğer SED varyantlarıyla çalışmayabileceğini unutmayın. Metakarakterleri ayrıntılı olarak tartışalım.
Kelime Sınırı (\ b)
Normal ifade terminolojisinde "\ b", kelime sınırıyla eşleşir. Örneğin, "\ b", "ile" eşleşir, ancak "bunlar", "orada", "onlar", "sonra" vb. İle eşleşmez. Aşağıdaki örnek bunu göstermektedir.
[jerry]$ echo -e "these\nthe\nthey\nthen" | sed -n '/\bthe\b/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
the
Sözcük Olmayan Sınır (\ B)
Normal ifade terminolojisinde "\ B", kelime olmayan sınırla eşleşir. Örneğin, "\ B" "bunlar" ve "onlar" ile eşleşir ancak "the" ile eşleşmez. Aşağıdaki örnek bunu göstermektedir.
[jerry]$ echo -e "these\nthe\nthey" | sed -n '/the\B/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
these
they
Tek Boşluk (\ s)
SED'de "\ s", tek bir boşluk karakteri anlamına gelir. Aşağıdaki örnek "Satır \ t1" ile eşleşir ancak "Satır1" ile eşleşmez.
[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\s/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
Line 1
Tek Boşluk Dışı (\ S)
SED'de "\ S", tek boşluk karakterini ifade eder. Aşağıdaki örnek "Satır2" ile eşleşir ancak "Satır \ t1" ile eşleşmez.
[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\S/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
Line2
Tek Sözcük Karakteri (\ w)
SED'de "\ w", tek kelimelik karakter, yani alfabetik karakterler, rakamlar ve alt çizgi (_) anlamına gelir. Aşağıdaki örnek bunu göstermektedir.
[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\w/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
One
123
1_2
Tek Sözcük Olmayan Karakter (\ W)
SED'de "\ W", "\ w" nin tam tersi olan tek sözcük olmayan karakteri ifade eder. Aşağıdaki örnek bunu göstermektedir.
[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\W/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
&;#
Desen Boşluğunun Başlangıcı (\ `)
SED'de "\" "desen uzayının başlangıcını ifade eder. Aşağıdaki örnek yalnızca "Bir" kelimesiyle eşleşmektedir.
[jerry]$ echo -e "One\nTwo One" | sed -n '/\`One/ p'
Yukarıdaki kodu çalıştırdığınızda, aşağıdaki sonucu alırsınız:
One