[Çözüldü] Bash Yardımıyla Metin Değiştirme

Başlatan mehardxx, 15 Şubat 2015 - 04:37:02

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

mehardxx

Merhabalar,
Gedit ile birkaç klasör altında txt dosyaları hazırladım. Ama hem Linux yerine "GNU/Linux" demenin hemde slogan değişikliğinden ötürü birkaç değişiklik yapmam gerekiyor.


$grep -r "Eski Metin" |  awk 's/Eski Metin/Yeni Metin/p' yazmama rağmen sonuç alamıyorum. "ölümcül: sıfırla bölme hatası" diye hata fırlatıyor. Grep i tek kullanınca buluyor.


Edit: hatayı yazmayı unutmuşum.
http://www.aytac.ninja
http://gnu-linux.weebly.com

Yazılım Mühendisliği 1.Sınıf

ersinkandemir

find . -name '*.txt' -exec sed -i 's/eski/yeni/g' {} \;

Bunu deneyebilirsiniz. Orjinalleri yedeklemeyi unutmayın. :)
Where there's a shell, there's a way.



heartsmagic

Soru kesinlikle awk üzerine mi? Eğer öyle değilse başlığı değiştirebiliriz sanırım. Eğer illa ki awk kullanılmayacaksa @ersinkandemir'in işaret ettiği üzere en ideal araç sed. Sende ufak bir durum var sadece o da GNU/Linux meselesi. Buradaki '/' karakterini kaçman lazım sed ile kullanırken. sed topluca düzenleyebiliyor dosyaları, find gerekmiyor sanırım burada :)

sed -i 's/Linux/GNU\/Linux/g' *.txt

awk ile de şu şekilde değişiyormuş ifadeler:

awk '{gsub("kelime", "yeni_kelime", $0); print}' falanca.dosya

Ancak, awk ne yazık ki dosyaya işleyemiyor, bunun için de takla atmak gerekiyor. İşte, bir döngü yaz, dosyayı bulsun awk ile değiştirsin, eskisini silsin falan.. Daha uzun iş yani.
Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.

mehardxx

Başlığı değiştirdim.
Açıkcası ben awk ile daha kolay olur diye düşünmüştüm. En azından awk bende öyle bi
intiba oluşturmuş.
İlk sormam gereken neden grep kullanmadık? Yani öyle daha kolay olmaz mı metin bulmak?
İkinci sed neden daha kolay?
Birde "{}" sed'den hemen sonra kullanılması gerekmiyor muydu? Neden böyle kullandık?
Cevaplar için çok teşekkürler bu arada sorun çözüldü.  :)
http://www.aytac.ninja
http://gnu-linux.weebly.com

Yazılım Mühendisliği 1.Sınıf

heartsmagic

Alıntı yapılan: mehardxx - 18 Şubat 2015 - 15:01:06
Başlığı değiştirdim.
Açıkcası ben awk ile daha kolay olur diye düşünmüştüm. En azından awk bende öyle bi
intiba oluşturmuş.
...
İkinci sed neden daha kolay?

man awk
Alıntı Yapmawk - pattern scanning and text processing language

man sed
Alıntı Yapsed - stream editor for filtering and transforming text

:) awk, esasında bildiğimiz bir dil, çok daha karmaşık işler yapılabilir. Fakat sed çok kolay bir "araç". Belki altyapı olarak yine bir programlama diline dayanıyordur ancak kendisi bu işler için biçilmiş kaftandır. Hani sed varken awk ile yapmak hem daha karmaşık hem de uğraş verici oluyor. Bir önceki iletimde awk örneğini koydum ve sorunu da aktarmaya çalıştım. Yine yapılır ancak bir iki işlem daha lazım. sed ile tek satırda yapıyoruz bunu kolayca, neden sed daha kolay olmasın :)

Alıntı Yap
İlk sormam gereken neden grep kullanmadık? Yani öyle daha kolay olmaz mı metin bulmak?

Gerekmiyorsa hiçbir fazladan araç kullanmamak lazım :) grep de bulur ancak gerek var mı? sed zaten arıyor ilgili kelimeyi, buluyor ve değiştiriyor. grep kullanmak araya bir başka araç sokmak, gereksiz iş yükü demek. Örneğin genelde şu şekilde yanlış bir kullanım vardır:

cat falanca.dosya | grep falanca_kelime

Bu çok yaygın bir yanlış kullanım örneğidir. grep zaten bu işi tek başına yapar:

grep falnca_kelime falanca_dosya

Alıntı Yap
Birde "{}" sed'den hemen sonra kullanılması gerekmiyor muydu? Neden böyle kullandık?

Yo hayır, hemen sed'den sonra koyamazsın, zira sed onu parametre gibi görür muhtemelen ve saçmalar. Kaldı ki -exec kullanımı için doğru yerde {}.
Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.