← man/text
sed — man sed — 80×24
ugur@toprak:~/man/text$man sed
Bölüm 1 Metin İşleme

sed

akış düzenleyici (stream editor)

Sinopsis (Synopsis)

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

Açıklama (Description)

sed yardımcı programı, belirtilen dosyaları veya hiçbir dosya belirtilmemişse standart girişi 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. Çoklu komutlar -e veya -f seçenekleri kullanılarak belirtilebilir. Tüm komutlar, kökenlerine bakılmaksızın belirtildikleri sırayla girdiye uygulanır.

Aşağıdaki seçenekler mevcuttur:

  • -E: Düzenli ifadeleri temel düzenli ifadeler (BRE) yerine genişletilmiş (modern) düzenli ifadeler olarak yorumlar. re_format(7) kılavuz sayfası her iki biçimi de tam olarak açıklamaktadır.

  • -a: Varsayılan olarak, “w” fonksiyonları için parametre olarak listelenen dosyalar herhangi bir işlem başlamadan önce oluşturulur (veya kesilir). -a seçeneği, sed'in ilgili “w” fonksiyonunu içeren bir komut bir girdi satıra uygulanana kadar her bir dosyayı açmayı geciktirmesini sağlar.

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

-f komut_dosyası komut_dosyası dosyasında bulunan düzenleme komutlarını komutlar listesine ekler. Düzenleme komutlarının her biri ayrı bir satırda listelenmelidir. Eğer komut_dosyası “-” ise komutlar standart girişten okunur.

  • -H: Düzenli ifade sözdizimindeki 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 bir uzantı verilirse, yedek kaydedilmeyecektir. Disk alanının tükenmesi vb. durumlarda bozulma veya kısmi içerik riski taşıdığınız için, dosyaları yerinde düzenlerken sıfır uzunlukta bir uzantı verilmesi önerilmez.

-I ile yerinde düzenlemenin, her dosya tek bir çıktı akışı oluşturmak yerine kendi bireyselliğini korumasına rağmen, tüm dosyaları kapsayan tek bir sürekli satır adresi alanında gerçekleştiğini unutmayın. Satır sayacı dosyalar arasında asla 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. (Bkz. Sed Adresleri.) Bu durum, yerinde düzenleme yapılan birçok durumda beklenmedik sonuçlara yol açabilir; bu tür durumlarda -i kullanılması istenir.

-i uzantı Dosyaları -I seçeneğine benzer şekilde yerinde düzenler, ancak her dosyayı diğer dosyalardan bağımsız olarak ele alır. Özellikle, 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 dosya ile sınırlıdır. (Bkz. Sed Adresleri.) Nihai 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 (echo). -n seçeneği bu davranışı bastırır.

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

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

Bir sed komutunun biçimi aşağıdaki gibidir:

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

Komutun ilk adresinden ve fonksiyon kısımlarından önce boşluk eklenebilir.

Normalde sed, bir girdi satırını (sonundaki satır sonu karakteri hariç) döngüsel olarak bir kalıp alanına (pattern space) kopyalar (bir “D” fonksiyonundan sonra kalan bir şey olmadığı sürece), bu kalıp alanını seçen adreslere sahip tüm komutları uygular, kalıp alanını bir 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ı kaydetmek amacıyla bir tutma alanı (hold space) kullanır.

Sed Adresleri Bir adres gerekli değildir, ancak belirtilirse aşağıdaki biçimlerden birine sahip olmalıdır:

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

• girdinin son satırını (veya bir -i seçeneği belirtilmişse mevcut dosyanın son satırını) adresleyen bir dolar (“$”) karakteri;

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

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

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

İki adresi olan bir 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 bir (“+”) eklenebilir. İkinci adresin bir bağlam adresi olduğu durumda sed, ikinci adresi ilk adresle eşleşen kalıp alanıyla yeniden eşleştirmez. Seçilen aralığı takip eden ilk satırdan başlayarak sed, ilk adresi tekrar aramaya başlar.

Düzenleme komutları, ünlem karakteri (“!”) 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, daha fazla bilgi için re_format(7) sayfasına bakın), ancak -E bayrağı verilirse bunun yerine genişletilmiş (modern) düzenli ifadeler kullanılabilir. Ek olarak, sed düzenli ifadelere aşağıdaki iki eklemeye sahiptir:

  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ı bir eğik çizgi (slash) olmadığı sürece, açılış sınırlayıcısının önüne bir ters eğik çizgi getirilmelidir. Örneğin, \xabcx bağlam adresi /abc/ adresine eşdeğerdir. Ayrıca, düzenli ifade içinde sınırlayıcı karakterden önce bir ters eğik çizgi karakteri konulması, o karakterin harfi harfine (literal) ele alınmasına neden olur. Örneğin, \xabc\xdefx bağlam adresinde RE sınırlayıcısı bir “x”tir ve ikinci “x” kendisini temsil eder, böylece düzenli ifade “abcxdef” olur.

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

sed düzenli ifadelerinin özel bir özelliği, varsayılan olarak kullanılan son düzenli ifadeye dönebilmeleridir. Bir 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, bir adresin veya değiştirme komutunun parçası olarak 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 ikame edecektir.

Sed Fonksiyonları Aşağıdaki komut listesinde, her komut için izin verilen maksimum adres sayısı, sıfır, bir veya iki adresi temsil eden 0addr, [1addr] veya [2addr] ile belirtilmiştir.

text argümanı bir veya daha fazla satırdan oluşur. Metne bir satır sonu gömmek için önüne bir ters eğik çizgi getirin. Metindeki diğer ters eğik çizgiler silinir ve takip eden 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'e argüman olarak verilen her dosya, herhangi bir 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 sinopsisler, hangi argümanların fonksiyon harflerinden boşluk karakterleriyle ayrılması gerektiğini gösterir.

Fonksiyonlardan ikisi bir fonksiyon listesi (function-list) alır. Bu, aşağıdaki gibi satır sonlarıyla ayrılmış sed fonksiyonlarının bir listesidir:

{ fonksiyon fonksiyon ... fonksiyon }

“{” işaretinden önce boşluk gelebilir ve bunu boşluk takip edebilir. fonksiyondan önce boşluk gelebilir. Sonlandırıcı “}” işaretinden önce bir satır sonu gelmelidir ve bundan önce de boşluk gelebilir.

[2addr] fonksiyon-listesi fonksiyon-listesi'ni 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 (ister “N” fonksiyonunu yürüterek ister yeni bir döngü başlatarak olsun) metin içeriğini standart çıktıya yazar.

[2addr]b[etiket] Belirtilen etikete sahip “:” fonksiyonuna dallanır. Etiket belirtilmemişse betiğin sonuna dallanır.

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

[2addr]d Kalıp alanını siler ve bir 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 bir 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 bir 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 bir 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 net bir biçimde standart çıktıya yazar. Bu biçim aşağıdaki gibidir:

ters eğik çizgi \ uyarı (alert) \a sayfa besleme \f satır başı (carriage) \r sekme (tab) \t dikey sekme \v

Yazdırılamayan karakterler, karakterdeki her bayt için (önce en önemli bayt olmak üzere) üç haneli sekizlik sayılar olarak (önünde bir ters eğik çizgi ile) yazılır. Uzun satırlar katlanır ve katlama noktası bir ters eğik çizgi ve ardından bir satır sonu gösterilerek belirtilir. Her satırın sonu bir “$” 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 Eklenen malzemeyi orijinal içerikten ayırmak için gömülü bir satır sonu karakteri kullanarak bir sonraki girdi satırını kalıp alanına ekler. 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 hiçbir 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. Düzenli ifade ve değiştirme içinde, önüne bir ters eğik çizgi getirilirse sınırlayıcının kendisi harfi harfine bir karakter olarak kullanılabilir.

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

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

Değiştirme fonksiyonundaki bayraklar (flags) değeri, 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 Bir 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, yine de bir değişiklik yapılmış sayılır.

w dosya Bir 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 yine de bir değişiklik yapılmış sayılır.

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

[2addr]t [etiket] Girdi satırının en son okunmasından veya bir “t” fonksiyonunun yürütülmesinden bu yana herhangi bir değişiklik yapıldıysa, etikete sahip “:” fonksiyonuna dallanır. Etiket belirtilmemişse 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 ve ters eğik çizgiyi takip eden bir ``n'' bir satır sonu karakteri ile değiştirilir.

[2addr]!fonksiyon [2addr]!fonksiyon-listesi Fonksiyonu veya fonksiyon-listesini yalnızca adres(ler) tarafından seçilmeyen satırlara uygular.

Bu fonksiyon hiçbir şey yapmaz; “b” ve “t” komutlarının dallanabileceği bir etiket taşır.

[1addr]= Satır numarasını ve ardından bir 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 (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 (Environment)

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

Çıkış Durumu (Exit Status)

sed yardımcı programı başarı durumunda 0 ile, bir hata oluşursa >0 ile çıkar.

Örnekler (Examples)

     Başka bir komuttan yönlendirildiğinde (pipe) ‘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 bir yedeğini oluşturmadan ‘bar’ ile değiştirin:

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

Ayrıca Bakınız (See Also)

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 (Standards)

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ı, bir adres aralığının ikinci üyesindeki önek olarak gelen “+” işaretinin yanı sıra adres düzenli ifadesine ve değiştirme komutuna yönelik “I” bayrağı standart dışı FreeBSD uzantılarıdır ve diğer işletim sistemlerinde mevcut olmayabilir.

Tarihçe (History)

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

Yazarlar (Authors)

Diomidis D. Spinellis dds@FreeBSD.org

Hatalar (Bugs)

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.

macOS 26.4 17 Aralık, 2024 macOS 26.4