Android

Dosyalarda dize bulmak ve değiştirmek için sed nasıl kullanılır

1 VİDEODA PYTHON ÖĞREN | PYTHON DERSLERİ [2020]

1 VİDEODA PYTHON ÖĞREN | PYTHON DERSLERİ [2020]

İçindekiler:

Anonim

Çoğu zaman metin dosyalarıyla çalışırken bir veya daha fazla dosyadaki metin dizelerini bulmanız ve değiştirmeniz gerekir.

sed bir tream ed editördür. Dosyalarda ve boru hatları gibi giriş akışlarında temel metin manipülasyonu gerçekleştirebilir. sed ile kelimeleri, satırları 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.

, dizeleri bulma ve sed ile nasıl değiştireceğimiz hakkında konuşacağız. Ayrıca özyinelemeli arama ve değiştirme işlemlerinin nasıl yapılacağını da göstereceğiz.

sed Bul ve Değiştir ile sed

sed çeşitli versiyonları vardır, aralarında bazı fonksiyonel farklılıklar vardır. macOS BSD sürümünü kullanır ve ç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 aşağıdaki formu alır:

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

  • -i - sed varsayılan olarak çıktısını standart çıktıya yazar. Bu seçenek sed dosyaları yerinde düzenlemesini söyler. Bir uzantı sağlanırsa (ex -i.bak) orijinal dosyanın yedeği oluşturulur. s - Yedek komut, muhtemelen sed'de en çok kullanılan komut. / / / - Sınırlayıcı karakter. Herhangi bir karakter olabilir, ancak genellikle eğik çizgi ( / ) karakteri kullanılır. SEARCH_REGEX - Normal dize veya SEARCH_REGEX normal ifade. REPLACEMENT - Değiştirme dizesi. g - Genel değiştirme bayrağı. sed varsayılan olarak dosyayı satır satır okur ve bir satırdaki SEARCH_REGEX yalnızca ilk tekrarlamasını değiştirir. Değiştirme bayrağı sağlandığında, tüm oluşumlar değiştirilir. INPUTFILE - Komutu çalıştırmak istediğiniz dosyanın adı.

Kabuğun meta karakterlerinin genişlememesi için, bağımsız değişkenin içine tırnak koymak iyi bir uygulamadır.

Dosyalarda metin aramak ve en sık kullanılan seçeneklerden bazılarıyla değiştirmek için sed komutunun nasıl kullanılacağına dair örnekleri görelim.

Gösterim amacıyla, aşağıdaki dosyayı kullanacağız:

file.txt

123 Foo foo foo foo /bin/bash Ubuntu foobar 456

sed -i 's/foo/linux/' file.txt

123 Foo linux foo linux /bin/bash Ubuntu foobar 456

Genel değiştirme bayrağı sed ile arama deseninin tüm tekrarlarının yerini alır:

sed -i 's/foo/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu linuxbar 456

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

sed -i 's/\bfoo\b/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu foobar 456

Deseni eşleme 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:

sed -i 's/foo/linux/gI' file.txt

123 linux linux linux linux /bin/bash Ubuntu linuxbar 456

sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt

Daha kolay ve 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|/bin/bash|/usr/bin/zsh|g' file.txt

123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456

Ayrıca düzenli ifadeler de kullanabilirsiniz. Örneğin, 3 basamaklı sayıların tümünü aramak ve bunları yerine kullanacağınız dize number değiştirmek için:

sed -i 's/\b\{3}\b/number/g' file.txt

number Foo foo foo foo /bin/bash demo foobar number

Sed'in bir başka yararlı özelliği de ve işareti karakterini kullanabilmenizdir. Karakter birden çok kez kullanılabilir.

Örneğin, her 3 basamaklı sayının etrafına süslü ayraçlar {} eklemek istiyorsanız, şunu yazın:

sed -i 's/\b\{3}\b/{&}/g' file.txt

{123} Foo foo foo foo /bin/bash demo foobar {456}

Son olarak, sed ile bir dosyayı düzenlerken yedekleme yapmak her zaman iyi bir fikirdir. Bunu yapmak için sadece -i seçeneğine bir uzantı sağlayın. Örneğin, file.txt düzenlemek ve orijinal dosyayı file.txt.bak olarak kaydetmek için şunları kullanırsınız:

sed -i.bak 's/foo/linux/g' file.txt

ls

file.txt file.txt.bak

Yinelemeli Bul ve Değiştir

Bazen bir dizeyi içeren dosyalar için dizinleri özyinelemeli olarak aramak ve dizeyi tüm dosyalarda değiştirmek istersiniz. Bu, dizindeki dosyaları özyinelemeli olarak find veya grep gibi komutlar kullanılarak ve dosya adlarını sed .

Aşağıdaki komut, geçerli çalışma dizinindeki dosyaları özyinelemeli olarak arar ve dosya adlarını sed .

find. -type f -exec sed -i 's/foo/bar/g' {} +

-print0 boşluk içeren dosyalarla ilgili sorunları önlemek için, dosya adını yazdırmayı find ve ardından boş bir karakter -print0 ve çıktıyı xargs -0 kullanarak -print0 yönlendiren -print0 seçeneğini kullanın:

find. -type f -print0 | xargs -0 sed -i 's/foo/bar/g'

Bir dizini hariç tutmak için -not -path seçeneğini kullanın. Örneğin, nokta ( . ) İle başlayan tüm dosyaları hariç tutmak için yerel git deponuzdaki bir dizeyi değiştiriyorsanız, şunu kullanın:

find. -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'

find. -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'

Başka bir seçenek, arama desenini içeren tüm dosyaları özyinelemeli olarak bulmak için grep komutunu kullanmak ve daha sonra dosya adlarını sed aktarmaktır:

grep -rlZ 'foo'. | xargs -0 sed -i.bak 's/foo/bar/g'

Sonuç

Karmaşık ve karmaşık görünse de, ilk başta, dosyalardaki metni sed ile değiştirmek ve değiştirmek çok basittir.

sed komutları, seçenek ve bayraklar hakkında daha fazla bilgi edinmek için GNU sed kılavuzunu ve Grymoire sed eğitimini ziyaret edin. Herhangi bir sorunuz veya geri bildiriminiz varsa, yorum bırakmaktan çekinmeyin.

sed terminali