Örneklerle Linux’ta Sed Komutu Nasıl Kullanılır

Merhabalar,

 

Metin dosyalarıyla çalışırken, genellikle bir veya daha fazla dosyadaki metin dizelerini bulmanız ve değiştirmeniz gerekir.

 

sed bir akış düzenleyicisidir. Dosyalar ve boru hatları gibi girdi akışları üzerinde temel metin işlemeyi gerçekleştirebilir. sed ile kelime ve satır arayabilir, bulabilir ve değiştirebilir, ekleyebilir ve silebilirsiniz. Karmaşık kalıpları eşleştirmenize izin veren temel ve genişletilmiş düzenli ifadeleri destekler.

 

Bu yazıda, stringleri sed ile nasıl bulacağız ve değiştireceğimiz hakkında konuşacağız. Ayrıca size özyinelemeli (recursive) bir aramayı ve değiştirmeyi nasıl yapacağınızı göstereceğim.

 

 

Sed Dizini Bul ve Değiştir:

Aralarında bazı işlevsel farklılıklar bulunan sed’in birkaç sürümü vardır. macOS, BSD sürümünü kullanırken, çoğu Linux dağıtımı varsayılan olarak önceden yüklenmiş GNU sed ile gelir. GNU sürümünü kullanacağız.

 

sed kullanarak metin aramanın ve değiştirmenin genel biçimi şu şekildedir:

sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE

 

 

-i – Varsayılan olarak, sed çıktısını standart çıktıya yazar. Bu seçenek sed’e dosyaları yerinde düzenlemesini söyler. Bir uzantı sağlanırsa (ex -i.bak), orijinal dosyanın bir yedeği oluşturulur.

s – substitute komutu, muhtemelen sed’de en çok kullanılan komut.

/ / / – Ayırıcı karakter. Herhangi bir karakter olabilir, ancak genellikle eğik çizgi (/) karakteri kullanılır.

SEARCH_REGEX – Aranacak normal biri yazı  veya normal bir ifade.

REPLACEMENT – Mevcut yazı ile değiştirilecek yazı

g – Global (Genel) değiştirme bayrağı (flag). Varsayılan olarak, sed dosyayı satır satır okur ve bir satırdaki SEARCH_REGEX’in yalnızca ilk oluşumunu değiştirir. Değiştirme bayrağı sağlandığında, tüm oluşumlar değiştirilir.

INPUTFILE– Üzerinde komutu çalıştırmak istediğiniz dosyanın adı.

Shell meta karakterlerinin genişlememesi için argümanın etrafına tırnak işareti koymak iyi bir uygulamadır.

En sık kullanılan seçenekler ve bayraklardan bazılarıyla dosyalarda metin aramak ve değiştirmek için sed komutunu nasıl kullanabileceğimizi görelim.

Gösterme amacıyla aşağıdaki dosyayı kullanacağız.

 

 

sed -i 's/Ahmet/Bomba/g' linux.txt

 

 

g bayrağı atlanırsa, her satırdaki arama dizesinin yalnızca ilk örneği değiştirilir.Bakınız g bayrağı kullanılmadı satırlardaki İlk Bomba kelimesini Ahmet ile değiştirdi.

 

sed -i 's/Bomba/Ahmet/' linux.txt

 

 

Global değiştirme bayrağıyla sed, arama modelinin tüm oluşumlarını değiştirir.

sed -i 's/Bomba/Ahmet/g' linux.txt

 

 

sed -i 's/Ahmet/Bomba/g' linux.txt

 

Fark etmiş olabileceğiniz gibi, Ahmetefe kelimesinin içindeki  Ahmet de önceki örnekte değiştirilmiştir. Bu istenen davranış değilse, arama dizesinin her iki ucunda sözcük sınırı ifadesini (\b) kullanın. Bu, kısmi kelimelerin eşleşmemesini sağlar.

 

sed -i 's/Ahmet\b/Bomba/g' linux.txt

 

 

Desen eşleşmesini büyük/küçük harfe duyarlı hale getirmek için I bayrağını kullanın. Aşağıdaki örnekte hem g hem de I bayraklarını kullanıyoruz.

ilk önce kullanmadan önce bir örnek yapalım. I bayrağı kullanılmadan Ahmet kelimesi Bomba kelimeleri yer değiştirsin istiyoruz.Tamamen büyük küçük karakter uyuşması gerekmektedir.Değişme için.

 

 

 

 

I bayrağını kullandığımızda büyük küçük karakter kontrolü yapılmadan dizin  ifadenin uyuşması yeterli.Tüm Ahmet ifadeleri küçük büyük demeden Bomba ile değiştirildi.

 

sed -i 's/Ahmet/Bomba/gI' linux.txt

 

 

 Delimiter karakteri (/) içeren bir dize bulmak ve değiştirmek istiyorsanız, eğik çizgiden çıkmak için ters eğik çizgiyi (\) kullanmanız gerekir. Örneğin /etc/network/ ‘ı //home/firatcanoglu/Desktop/ ile değiştirmek için kullanacağız.Deneyelim.

sed -i 's/\/etc\/network/\/home\/firatcanoglu\/Desktop/g' linux2.txt

 

 

 

Daha kolay ve çok daha okunabilir seçenek, başka bir sınırlayıcı karakter kullanmaktır. Çoğu kişi dikey çubuk (|) veya iki nokta üst üste (:) kullanır, ancak başka herhangi bir karakter kullanabilirsiniz.

sed -i 's|/etc/network|/home/firatcanoglu/Desktop|g' linux2.txt

 

 

 

Normal ifadeler de kullanabilirsiniz. Örneğin, 3 basamaklı sayıların tümünü aramak ve bunları EFRAN  kelimesi ile değiştirelim.

sed -i 's/\b[0-9]\{3\}\b/EFRAN/g' linux3.txt

 

 

 

sed’in bir başka kullanışlı özelliği de, eşleşen desene karşılık gelen & işareti karakterini kullanabilmenizdir. Karakter birden çok kez kullanılabilir.

Örneğin, her 3 basamaklı sayının etrafına {} kaşlı ayraçlar eklemek istiyorsanız şunu yazabiliriz.

sed -i 's/\b[0-9]\{3\}\b/{&}/g' linux3.txt

 

 

 

Son olarak, bir dosyayı sed ile düzenlerken yedekleme yapmak her zaman iyi bir fikirdir. Bunu yapmak için, yedekleme dosyası için -i seçeneğine bir uzantı sağlamanız yeterlidir. Örneğin, linux.txt dosyasını düzenlemek ve orijinal dosyayı linux.txt.bak olarak kaydetmek için aşağıdaki komutu kullanabiliriz.

sed -i.bak 's/Bomba/PIM/g' linux.txt

 

Yedeklemenin oluşturulduğundan emin olmak için ls komutuyla dosyaları listeleyebiliriz.

 

 

 

Recursive (Özyinelemeli) Bul ve Değiştir:

Bazen bir dize içeren dosyalar için dizinleri tekrar tekrar aramak ve dizeyi tüm dosyalarda değiştirmek isteyebilirsiniz. Bu, dizindeki dosyaları tekrar tekrar bulmak ve dosya adlarını sed’e aktarmak için find veya grep gibi komutlar kullanılarak yapılabilir.

Aşağıdaki komut, geçerli çalışma dizinindeki dosyaları tekrar tekrar arayacak ve dosya adlarını sed’e iletecektir.Bu komut tüm dizindeki dosyaları bulacak ve Bomba kelimesini EFRAN ile değişitirecek.Benim dizinde 3 adet dosya vardı.Hepsinin içerisi değiştirildi.

 

find . -type f -exec sed -i 's/Bomba/EFRAN/g' {} +

 

 

Adlarında boşluk içeren dosyalarla ilgili sorunları önlemek için, find öğesine dosya adını yazdırmasını ve ardından bir boş karakterini takip etmesini söyleyen -print0 seçeneğini kullanın ve xargs -0 kullanarak çıktıyı sed öğesine yönlendirin.Alttada görüldüğü gibi 3 adet isminde boşluk bulunan dosyam var.Bu dosyaların içindeki EFRAN kelimesini Bomba kelimesi  ile değiştiriyorum.

 

find . -type f -print0 | xargs -0 sed -i 's/EFRAN/Bomba/g'

 

 

 

Bir dizini hariç tutmak için -not -path seçeneğini kullanın. Örneğin,  (EF) ile başlayan tüm dosyaları hariç tutmak için aşağıdaki komutu kullanabiliriz.Aşağıda kullandığımız komut ile linux 1.txt ve linux 2.txt içeriğindeki Bomba kelimesi EFRAN ile değişti. EFlinux 3.txt dosyası değişmedi.Çünkü EF ile başlayan dosyaları hariç tuttum.

find . -type f -not -path '*/\EF*' -print0 | xargs -0 sed -i 's/Bomba/EFRAN/g'

 

 

Yalnızca belirli bir uzantıya sahip dosyalarda metin aramak ve değiştirmek istiyorsak aşağıdaki komutu kullanabiliriz.Aşağıdaki dizinde sadece *.txt uzantılı dosyaların  içeriğinin değiştirilmesi  aşağıdaki komutu çalıştırabiliriz.

find . -type f -name "*.txt" -print0 | xargs -0 sed -i 's/EFRAN/Bomba/g'

 

 

Başka bir seçenek de, arama modelini içeren tüm dosyaları tekrar tekrar bulmak için grep komutunu kullanmak ve ardından dosya adlarını sed’e yönlendirmektir deneyelim.Aşağıdaki komut grep komutu ile EFRAN içeren dosyaları bulup EFRAN kelimesini Bomba kelimesi ile değiştirecek.

grep -rlZ 'EFRAN' . | xargs -0 sed -i.bak 's/EFRAN/Bomba/g'

 

 

Bu eğitim yazımızında sonuna geldik.Umarım sizler için faydalı olur.

 

 

 

Bu eğiticiye oy ver
[Total: 2 Average: 5]
Firat CANOĞLU TAĞ