Yalnızca terminal kullanarak bir dosyayı programlı olarak nasıl düzenleyebilirim?


13

Komut dosyasını okuyabildiğim ve manuel müdahale olmadan dosyayı düzenleyebileceğim bir kabuk komut dosyası yazmak istiyorum (bazı metinleri aramaya ve başka biriyle değiştirmeye dayanarak).

Bunun için herhangi bir metin editörü kullanmanıza gerek yok .... sadece metin arama (grep kullanmak gibi) ve sonra başka bir metinle değiştirerek ve değişiklikleri kaydetme ....

Yanıtlar:


10

İşte burada seddevreye giriyor. Bir sedkomut şu biçime sahiptir:

[pattern1][,pattern2][!] command [args]

Regexes kullanır, böylece biraz zor olabilir / olacaktır. Aşağıdaki 2. bağlantıdan alınan bazı temel örnekler:

# substitu (find and replace) "foo" ile her satırda "bar"
sed 's / foo / bar /' # bir satırdaki yalnızca ilk örneğin yerine geçer
sed 's / foo / bar / 4' # bir satırdaki yalnızca 4. örneğin yerine geçer
sed 's / foo / bar / g' # bir satırdaki TÜM örnekleri değiştirir
sed 's / \ (. * \) foo \ (. * foo \) / \ 1bar \ 2 /' # bir sonraki son durumu değiştir
sed 's / \ (. * \) foo / \ 1bar /' # yalnızca son durumu değiştir

# "foo" YALNIZCA "baz" içeren satırlar için "bar" ile değiştirilir
sed '/ baz / s / foo / bar / g'

# "baz" içeren satırlar için "foo" yerine "bar" hariç
sed '/ baz /! s / foo / bar / g'

# "kırmızı" veya "yakut" veya "puce" ifadesini "kırmızı" olarak değiştirin
sed 's / kırmızı / kırmızı / g; s / yakut / kırmızı / g; s / puce / kırmızı / g' en seds
gsed 's / scarlet \ | ruby ​​\ | puce / red / g' # sadece GNU sed

Bazı referanslar


7

Çok geç cevap. Bununla birlikte, bu benzer bir sorun / soruya sahip başkalarına yardımcı olabilir.

Bir yama oluşturmayı ve uygulamayı öneririm. Güzel bir örnek burada bulunabilir .

Örneğin, new.txt dosyasının eski.txt dosyasına uygulamak istediğiniz değişiklikleri içerdiği varsayılarak. Komutları terminalde veya patch_file.sh dosyası oluşturarak ve yürütebilirsiniz.

Komut satırı: bir terminal açın ve aşağıdaki satırları kopyalayıp yürütün (dosya adlarını gerektiği gibi değiştirin):

diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

Komut dosyası: .sh dosyası yaklaşımı kullanarak. Terminalde (klavye: ctrl + alt + t: gedit patch_file.sh

Terminalde, .sh dosyasına ve başlığın altındaki komutları aşağıda gösterildiği gibi kopyalayıp yapıştırın (gedit).

#!/bin/sh
diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

Komut dosyasını yürütülebilir yapın (terminal):

chmod +x patch_file.sh

Komut dosyasını çalıştırın (terminal):

./patch_file.sh # may require sudo access depending on the directory affected

+1 yaması, orta ila ağır veya karmaşık modifikasyon için her zaman düz yoldur. Bazılarının neden her şeyi regex araçlarını kullanarak yapmaya çalıştığını bilmiyorum.
user.dz

+1, test ettiğiniz dosyaya istediğiniz değişikliği uygulayan bir normal ifadeyi tersine mühendislikten çok daha iyi ... ancak bu dosyanın diğer örneklerine uygulandığında bazen başka etkileri de olabilir.
29:19 tarihinde bigjosh

Belirli metin dizelerinin tüm örneklerini değiştirmek, yani tüm "" ile "_", tüm "eksi" ile "-" ve tüm "gb | <string_of_numbers> | ARO:" ile " ARO: " Teşekkürler.
Josh

1

Bir dosyayı düzenlemek istiyorsanız, bir dosya düzenleyici kullanın, ex veya ed gibi komut dosyalarından kullanılabilen komut tabanlı dosya düzenleyicileri vardır .


1

Sed ya da awk arıyorsunuz. Daha basit olmak için sed ve daha güçlü olmak için garip buluyorum.

İşte başka bir sorudan bir örnek .

sed -i 's/gedit.desktop/yournew.desktop/g' /usr/share/applications/defaults.list

Bu şu anlama gelir:

  • dosyada ara /usr/share/applications/defaults.list
  • / Grep bul gedit.desktop
  • Şununla değiştir yournew.desktop
  • Değişiklikleri yerinde uygulayın -i

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.