man/text
man · Metin İşleme

$ sed

Bölüm 1 · Metin İşleme

akış düzenleyici

Özet

sed [-EHalnru] komut [-I uzantı] [-i uzantı] [dosya ...]
sed [-EHalnru] [-e komut] [-f komut_dosyası] [-I uzantı] [-i uzantı] [dosya ...]

Açıklama

sed yardımcı programı, belirtilen dosyaları veya dosya belirtilmemişse standart girdiyi okur ve girdiyi bir komut listesi tarafından belirtildiği şekilde değiştirir. Değiştirilen girdi daha sonra standart çıktıya yazılır.

sed için ilk argüman olarak tek bir komut belirtilebilir. Birden fazla komut, -e veya -f seçenekleri kullanılarak belirtilebilir. Tüm komutlar, kökenlerinden bağımsız olarak belirtildikleri sırayla girdiye uygulanır.

Seçenekler

  • -E: Düzenli ifadeleri temel düzenli ifadeler (BRE) yerine genişletilmiş düzenli ifadeler olarak yorumlar. Her iki biçim için re_format(7) sayfasına bakın.

  • -a: Varsayılan olarak, w fonksiyonları için parametre olarak listelenen dosyalar herhangi bir işlem başlamadan önce oluşturulur veya kesilir. -a, sed aracının ilgili w fonksiyonunu içeren komut bir girdi satırına uygulanana kadar her dosyayı açmayı geciktirmesini sağlar.

  • -e komut: komut argümanı ile belirtilen düzenleme komutlarını komut listesine ekler.

  • -f komut_dosyası: komut_dosyası dosyasında bulunan düzenleme komutlarını komut listesine ekler. Her düzenleme komutu ayrı bir satırda yer almalıdır. komut_dosyası değeri - ise komutlar standart girdiden okunur.

  • -H: Düzenli ifade söz dizimindeki gelişmiş özellikleri etkinleştirir. Bu seçeneğin -E seçeneğinden bağımsız olduğunu unutmayın. Ayrıntılar için re_format(7) sayfasına bakın.

  • -I uzantı: Dosyaları yerinde (in-place) düzenler ve belirtilen uzantıyla yedeklerini kaydeder. Sıfır uzunlukta uzantı verilirse yedek kaydedilmez. Disk alanının tükenmesi gibi durumlarda bozulma veya kısmi içerik riski taşıdığı için, dosyaları yerinde düzenlerken sıfır uzunlukta uzantı verilmesi önerilmez.

-I ile yerinde düzenleme, her dosya tek bir çıktı akışı oluşturmak yerine kendi bireyselliğini korusa da tüm dosyaları kapsayan tek bir sürekli satır adresi alanında gerçekleşir. Satır sayacı dosyalar arasında sıfırlanmaz, adres aralıkları dosya sınırlarını aşabilir ve $ adresi yalnızca son dosyanın son satırıyla eşleşir. Birçok yerinde düzenleme kullanımında bu beklenmedik sonuçlara yol açabilir; bu durumlarda -i kullanılması istenir.

  • -i uzantı: Dosyaları -I seçeneğine benzer şekilde yerinde düzenler, ancak her dosyayı diğerlerinden bağımsız olarak ele alır. Her dosyadaki satır numaraları 1'den başlar, $ adresi mevcut dosyanın son satırıyla eşleşir ve adres aralıkları mevcut dosyayla sınırlıdır. Sonuç, her dosya ayrı bir sed örneği tarafından düzenlenmiş gibidir.

  • -l: Çıktıyı satır arabellekli (line buffered) yapar.

  • -n: Varsayılan olarak, tüm komutlar uygulandıktan sonra her girdi satırı standart çıktıya yankılanır. -n bu davranışı bastırır.

  • -r: GNU sed ile uyumluluk için -E ile aynıdır.

  • -u: Çıktıyı arabelleksiz (unbuffered) yapar.

Komut Biçimi

Bir sed komutunun biçimi şöyledir:

[adres[,adres]]fonksiyon[argümanlar]

Komutun ilk adresinden ve fonksiyon bölümünden önce boşluk eklenebilir.

Normalde sed, bir girdi satırını sonundaki satır sonu karakteri hariç olacak şekilde döngüsel olarak kalıp alanına (pattern space) kopyalar. D fonksiyonundan sonra kalan içerik varsa bu davranış değişebilir. Ardından bu kalıp alanını seçen adreslere sahip tüm komutları uygular, kalıp alanını satır sonu ekleyerek standart çıktıya kopyalar ve kalıp alanını siler.

Bazı fonksiyonlar, sonraki işlemler için kalıp alanının tamamını veya bir kısmını saklamak amacıyla tutma alanı (hold space) kullanır.

Sed Adresleri

Adres gerekli değildir. Belirtilirse aşağıdaki biçimlerden birine sahip olmalıdır:

  • Girdi dosyaları boyunca birikimli olarak girdi satırlarını sayan bir sayı. -i seçeneği yürürlükteyse satırlar her dosyada bağımsız olarak sayılır.

  • Girdinin son satırını adresleyen dolar ($) karakteri. -i seçeneği belirtilmişse mevcut dosyanın son satırını adresler.

  • Önünde ve arkasında sınırlayıcı bulunan bir düzenli ifadeden oluşan bağlam adresi. Kapanış sınırlayıcısından sonra, düzenli ifadenin büyük/küçük harfe duyarsız eşleştirileceğini belirtmek için isteğe bağlı olarak I karakteri gelebilir.

Adresi olmayan komut satırı her kalıp alanını seçer.

Tek adresi olan komut satırı, adresle eşleşen tüm kalıp alanlarını seçer.

İki adresi olan komut satırı kapsayıcı bir aralık seçer. Bu aralık, ilk adresle eşleşen ilk kalıp alanı ile başlar. Aralığın sonu, ikinci adresle eşleşen bir sonraki kalıp alanıdır. İkinci adres, ilk seçilen satır numarasından küçük veya ona eşit bir sayıysa yalnızca o satır seçilir.

İkinci adresteki sayının önüne, ilk kalıptan sonra eşleşecek satır sayısını belirtmek için + eklenebilir. İkinci adres bir bağlam adresiyse sed, ikinci adresi ilk adresle eşleşen kalıp alanıyla yeniden eşleştirmez. Seçilen aralığı izleyen ilk satırdan başlayarak sed, ilk adresi tekrar aramaya başlar.

Düzenleme komutları, ünlem (!) fonksiyonu kullanılarak seçilmeyen kalıp alanlarına uygulanabilir.

Sed Düzenli İfadeleri

sed içinde kullanılan düzenli ifadeler varsayılan olarak temel düzenli ifadelerdir (BRE). -E bayrağı verilirse bunun yerine genişletilmiş düzenli ifadeler kullanılır. Daha fazla bilgi için re_format(7) sayfasına bakın.

sed, düzenli ifadelere şu eklemeleri yapar:

  1. Bir bağlam adresinde, düzenli ifadeyi sınırlamak için ters eğik çizgi (\) veya satır sonu karakteri dışındaki herhangi bir karakter kullanılabilir. Sınırlayıcı eğik çizgi (/) değilse açılış sınırlayıcısının önüne ters eğik çizgi getirilmelidir. Örneğin \xabcx bağlam adresi /abc/ adresine eşdeğerdir. Düzenli ifade içinde sınırlayıcı karakterden önce ters eğik çizgi kullanılması, o karakterin harfi harfine ele alınmasına neden olur.

  2. \n kaçış dizisi, kalıp alanına gömülü satır sonu karakteriyle eşleşir. Ancak bir adreste veya değiştirme komutunda harfi harfine satır sonu karakteri kullanılamaz.

sed düzenli ifadelerinin özel bir özelliği, varsayılan olarak kullanılan son düzenli ifadeye dönebilmeleridir. Düzenli ifade boşsa, yani yalnızca sınırlayıcı karakterler belirtilmişse, bunun yerine karşılaşılan son düzenli ifade kullanılır. Son düzenli ifade, derleme zamanında değil çalışma zamanında kullanılan son düzenli ifade olarak tanımlanır. Örneğin /abc/s//XXX/ komutu, abc kalıbı yerine XXX değerini koyar.

Sed Fonksiyonları

Aşağıdaki komut listesinde, her komut için izin verilen maksimum adres sayısı [0addr], [1addr] veya [2addr] ile belirtilmiştir.

metin argümanı bir veya daha fazla satırdan oluşur. Metne satır sonu gömmek için önüne ters eğik çizgi getirin. Metindeki diğer ters eğik çizgiler silinir ve izleyen karakter harfi harfine alınır.

r ve w fonksiyonları, fonksiyon harfinden boşlukla ayrılması gereken isteğe bağlı bir dosya parametresi alır. sed aracına argüman olarak verilen her dosya, girdi işleme başlamadan önce oluşturulur veya içeriği kesilir.

b, r, s, t, w, y, ! ve : fonksiyonlarının tümü ek argümanlar kabul eder. Aşağıdaki özetler, hangi argümanların fonksiyon harflerinden boşluk karakterleriyle ayrılması gerektiğini gösterir.

Fonksiyonlardan ikisi fonksiyon listesi alır. Fonksiyon listesi, satır sonlarıyla ayrılmış sed fonksiyonlarından oluşur:

{ fonksiyon
fonksiyon
...
fonksiyon
}

{ işaretinden önce boşluk gelebilir ve sonrasında boşluk bulunabilir. fonksiyon öncesinde boşluk gelebilir. Sonlandırıcı } işaretinden önce satır sonu gelmelidir ve bundan önce de boşluk bulunabilir.

  • [2addr]{ fonksiyon-listesi }: fonksiyon-listesi öğesini yalnızca kalıp alanı seçildiğinde yürütür.

  • [1addr]a\ metin: Bir girdi satırını okumaya yönelik her girişimden hemen önce metin içeriğini standart çıktıya yazar.

  • [2addr]b[etiket]: Belirtilen etikete sahip : fonksiyonuna dallanır. Etiket belirtilmezse betiğin sonuna dallanır.

  • [2addr]c\ metin: Kalıp alanını siler ve sonraki döngüyü başlatır. 0 veya 1 adresle ya da 2 adresli bir aralığın sonunda metin standart çıktıya yazılır.

  • [2addr]d: Kalıp alanını siler ve sonraki döngüyü başlatır.

  • [2addr]D: Kalıp alanının ilk satır sonu karakterine kadar olan ilk bölümünü siler ve sonraki döngüyü başlatır.

  • [2addr]g: Kalıp alanının içeriğini tutma alanının içeriğiyle değiştirir.

  • [2addr]G: Kalıp alanına satır sonu karakteri ve ardından tutma alanının içeriğini ekler.

  • [2addr]h: Tutma alanının içeriğini kalıp alanının içeriğiyle değiştirir.

  • [2addr]H: Tutma alanına satır sonu karakteri ve ardından kalıp alanının içeriğini ekler.

  • [1addr]i\ metin: metin içeriğini standart çıktıya yazar.

  • [2addr]l: Küçük L harfi. Kalıp alanını görsel olarak açık bir biçimde standart çıktıya yazar.

l fonksiyonunun kullandığı gösterim:

  • Ters eğik çizgi: \\
  • Uyarı (alert): \a
  • Sayfa besleme: \f
  • Satır başı (carriage return): \r
  • Sekme (tab): \t
  • Dikey sekme: \v

Yazdırılamayan karakterler, karakterdeki her bayt için üç haneli sekizlik sayılar olarak, önünde ters eğik çizgiyle yazılır. Uzun satırlar katlanır ve katlama noktası ters eğik çizgi ile ardından gelen satır sonu gösterilerek belirtilir. Her satırın sonu $ ile işaretlenir.

  • [2addr]n: Varsayılan çıktı bastırılmamışsa kalıp alanını standart çıktıya yazar ve kalıp alanını bir sonraki girdi satırıyla değiştirir.

  • [2addr]N: Bir sonraki girdi satırını kalıp alanına ekler. Eklenen malzemeyi özgün içerikten ayırmak için gömülü satır sonu karakteri kullanılır. Mevcut satır numarasının değiştiğini unutmayın.

  • [2addr]p: Kalıp alanını standart çıktıya yazar.

  • [2addr]P: Kalıp alanını ilk satır sonu karakterine kadar standart çıktıya yazar.

  • [1addr]q: Betiğin sonuna dallanır ve yeni bir döngü başlatmadan çıkar.

  • [1addr]r dosya: Bir girdi satırını okumaya yönelik bir sonraki girişimden hemen önce dosya içeriğini standart çıktıya kopyalar. dosya herhangi bir nedenle okunamazsa sessizce yoksayılır ve hata durumu ayarlanmaz.

  • [2addr]s/düzenli ifade/değiştirme/bayraklar: Kalıp alanındaki düzenli ifadenin ilk örneğini değiştirme dizesiyle değiştirir. Düzenli ifadeyi ve değiştirmeyi sınırlamak için eğik çizgi yerine ters eğik çizgi veya satır sonu dışındaki herhangi bir karakter kullanılabilir.

Değiştirmede görünen ampersan (&), düzenli ifadeyle eşleşen dizeyle değiştirilir. Bu özel anlam, önüne ters eğik çizgi getirilerek bastırılabilir. # bir rakam olmak üzere \# dizesi, karşılık gelen geriye doğru referans ifadesi tarafından eşleştirilen metinle değiştirilir; re_format(7) sayfasına bakın.

Bir satır, içine satır sonu karakteri koyularak bölünebilir. Değiştirme dizesinde satır sonu karakteri belirtmek için önüne ters eğik çizgi getirin.

Değiştirme Bayrakları

s fonksiyonundaki bayraklar aşağıdakilerden sıfır veya daha fazlasıdır:

  • N: Değişikliği yalnızca kalıp alanındaki düzenli ifadenin N. oluşumu için yapar.

  • g: Değişikliği yalnızca ilk eşleşme için değil, düzenli ifadenin çakışmayan tüm eşleşmeleri için yapar.

  • p: Değişiklik yapıldıysa kalıp alanını standart çıktıya yazar. Değiştirme dizesi değiştirdiği dizeyle özdeş olsa bile değişiklik yapılmış sayılır.

  • w dosya: Değişiklik yapıldıysa kalıp alanını dosya dosyasına ekler. Değiştirme dizesi değiştirdiği dizeyle özdeş olsa bile değişiklik yapılmış sayılır.

  • i, I: Düzenli ifadeyi büyük/küçük harfe duyarsız şekilde eşleştirir.

Diğer Fonksiyonlar

  • [2addr]t [etiket]: Girdi satırının en son okunmasından veya t fonksiyonunun yürütülmesinden bu yana herhangi bir değişiklik yapıldıysa, etikete sahip : fonksiyonuna dallanır. Etiket belirtilmezse betiğin sonuna dallanır.

  • [2addr]w dosya: Kalıp alanını dosya dosyasına ekler.

  • [2addr]x: Kalıp ve tutma alanlarının içeriklerini takas eder.

  • [2addr]y/dize1/dize2/: Kalıp alanındaki dize1 içindeki karakterlerin tüm oluşumlarını dize2 içindeki karşılık gelen karakterlerle değiştirir. Dizeleri sınırlamak için eğik çizgi yerine ters eğik çizgi veya satır sonu dışındaki herhangi bir karakter kullanılabilir. dize1 ve dize2 içinde, satır sonu dışındaki herhangi bir karakterin önündeki ters eğik çizgi o karakteri harfi harfine temsil eder. Ters eğik çizgiyi izleyen n, satır sonu karakteriyle değiştirilir.

  • [2addr]!fonksiyon: Fonksiyonu yalnızca adresler tarafından seçilmeyen satırlara uygular.

  • [2addr]!fonksiyon-listesi: Fonksiyon listesini yalnızca adresler tarafından seçilmeyen satırlara uygular.

  • [0addr]:etiket: Hiçbir şey yapmaz; b ve t komutlarının dallanabileceği etiketi taşır.

  • [1addr]=: Satır numarasını ve ardından satır sonu karakterini standart çıktıya yazar.

  • [0addr]: Boş satırlar yoksayılır.

  • [0addr]#: # ve satırın geri kalanı yoksayılır, yani yorum olarak kabul edilir. Tek istisna, dosyadaki ilk iki karakter #n ise varsayılan çıktının bastırılmasıdır. Bu, komut satırında -n seçeneğinin belirtilmesiyle aynıdır.

Ortam Değişkenleri

COLUMNS, LANG, LC_ALL, LC_CTYPE ve LC_COLLATE ortam değişkenleri, environ(7) sayfasında açıklandığı gibi sed aracının yürütülmesini etkiler.

Çıkış Durumu

sed yardımcı programı başarı durumunda 0, hata oluşursa >0 değeriyle çıkar.

Örnekler

Başka bir komuttan yönlendirildiğinde bar ifadesini baz ile değiştirin:

echo "An alternate word, like bar, is sometimes used in examples." | sed 's/bar/baz/'

Ters eğik çizgi kullanmak bazen okumayı ve takip etmeyi zorlaştırabilir:

echo "/home/example" | sed 's/\/home\/example/\/usr\/local\/example/'

Yollarla çalışırken farklı bir ayırıcı kullanmak kullanışlı olabilir:

echo "/home/example" | sed 's#/home/example#/usr/local/example#'

test.txt dosyasındaki tüm foo oluşumlarını, dosyanın yedeğini almadan bar ile değiştirin:

sed -i '' -e 's/foo/bar/g' test.txt

Ayrıca Bakınız

awk(1), ed(1), grep(1), regex(3), re_format(7)

Lee E. McMahon, SED - A Non-interactive Text Editor, AT&T Bell Laboratories, Computing Science Technical Report, 77, Ocak 1979.

Standartlar

sed yardımcı programının IEEE Std 1003.2 (POSIX.2) özelliklerinin bir üst kümesi olması beklenmektedir.

-E, -I, -a ve -i seçenekleri; -f - ifadesinin özel anlamı; adres aralığının ikinci üyesindeki önek +; adres düzenli ifadesi ve değiştirme komutuna yönelik I bayrağı standart dışı FreeBSD uzantılarıdır ve diğer işletim sistemlerinde bulunmayabilir.

Tarihçe

L. E. McMahon tarafından yazılan bir sed komutu, Sürüm 7 AT&T UNIX'te ortaya çıkmıştır.

Yazarlar

Diomidis D. Spinellis <dds@FreeBSD.org>

Hatalar

0x5C (ASCII \) değerine sahip bir bayt içeren çok baytlı karakterler, a, c ve i komutlarına verilen argümanlarda satır devam ettirme karakterleri olarak yanlış ele alınabilir. Çok baytlı karakterler, s ve y komutlarında sınırlayıcı olarak kullanılamaz.