Soru Bir dizenin tüm yinelemelerini bir dizin ağacında yinelemeli olarak nasıl bulunur ve değiştirilir?


Sadece grep ve sed kullanarak, tüm oluşumları nasıl değiştirebilirim:

a.example.com

ile

b.example.com

altında bir metin dosyası içinde /home/user/ dizin ağacında, alt dizinlerdeki tüm dosyalarda yinelenen tüm dosyaları bulur ve değiştirir.


37
2017-10-18 15:32


Menşei




Cevaplar:


Bunu dene: find /home/user/ -type f | xargs sed -i 's/a.example.com/b.example.com/g'


58
2017-10-18 15:36



Bu, / home / user dizini altındaki her dosyadaki dizgiyi değiştirecek mi? Alt dizinler dahil mi? - Tony
Evet, bulduktan sonra bir çeşit pattern -name 'pattern' belirtmelisiniz - vehomzzz
"Bir çeşit desen" ne demek istiyorsun? - Tony
Gibi bir desen -name 'pattern' - "desen" in "alan listesi *" gibi olabileceği - aramayı daraltan bir şey. - Dennis Williamson
Göre stackoverflow.com/a/1583282/477451kullanmak iyi bir fikir -print0 ve -0 üzerinde find ve xargs sırasıyla komutlar. - Mansoor Siddiqui


Bunu dene:

grep -rl 'SearchString' ./ | xargs sed -i 's/REPLACESTRING/WITHTHIS/g'

grep -rl yinelemeli aramak için SEARCHSTRING dizinlerde ./ ve dizeleri kullanarak değiştirir sed.

Ör:

Bir ismin değiştirilmesi TOM ile JERRY arama dizesini kullanarak SWATKATS dizinde CARTOONNETWORK

grep -rl 'SWATKATS' CARTOONNETWORK/ | xargs sed -i 's/TOM/JERRY/g'

Bu yerini alacak TOM ile JERRY altındaki tüm dosyalar ve alt dizinlerde CARTOONNETWORK dize nerede bulursa SWATKATS.


16
2018-06-30 07:13



Bu cevap için ve hata yapmamak için başka dosyalara nasıl yazacağınız için teşekkür ederiz. - ThePassenger


Bunun gerçekten eski bir soru olduğunu biliyorum, ama ...

  1. @ vehomzzz cevap kullanır find ve xargs sorular açıkça belirdiğinde grep ve sed bir tek.

  2. @EmployedRussian ve @BrooksMoses bir çift olduğunu söylemeyi denedi awk ve sedama yine de, soru açıkça diyor ki grep ve sed  bir tek.

Öyleyse çözümüm, Bash'i kabuğun olarak kullandığınızı varsayalım:

OLDIFS=$IFS
IFS=$'\n'
for f in `grep -rl a.example.com .` # Use -irl instead of -rl for case insensitive search
do
    sed -i 's/a\.example\.com/b.example.com/g' $f # Use /gi instead of /g for case insensitive search
done
IFS=$OLDIFS

Unix SHell gibi farklı bir kabuk kullanıyorsanız, bana bildirin ve bir sözdizimi ayarı bulmaya çalışacağım.

P.S .: İşte bir tek liner:

OLDIFS=$IFS;IFS=$'\n';for f in `grep -rl a.example.com .`;do sed -i 's/a\.example\.com/b.example.com/g' $f;done;IFS=$OLDIFS

Kaynaklar:


4
2017-09-15 03:34



Sed alternatif bir karakter ayırıcısı kullanarak destekler % Bu, URL'lerde yaygın değildir, dolayısıyla tüm kesiklerden kaçmak zorunda kalmazsınız. - dragon788
@ dragon788 Bunu bilmiyordum, ancak eğik çizgilerden kaçmıyordum. Dönemlerden kaçıyordum. Bir periyot, herhangi bir karakter için normal ifade özelliğidir, dolayısıyla bir alan adındaki süreye özel olarak eşleşmesi gerekir. - Timberwolf


Bu komutu dene:

/home/user/ directory - find ./ -type f \
-exec sed -i -e 's/a.example.com/b.example.com/g' {} \;

1
2018-03-14 15:29



Merhaba. Lütfen kodu sadece cevap olarak dökmeyin. Ne yaptığınızı açıklayın, böylece kullanıcılar sorunu nasıl çözeceklerini anlayabilirler. Şerefe. - Cthulhu


Benim için sıradaki komut çalışır:

find /path/to/dir -name "file.txt" | xargs sed -i 's/string_to_replace/new_string/g'

dize, "yol / to / dir" eğik çizgi içeriyorsa, ayırmak için başka bir karakterle değiştirebilir, bunun yerine '/' yerine '/'.

Örneğin: 's@string/to/replace@new/string@g'


1
2018-03-19 13:44





Aşağıdaki komut, adlarıyla arama modeliyle eşleşen ve dizeyi değiştiren tüm dosyaları tekrar arar:

find /path/to/searchdir/ -name "serachpatter" -type f | xargs sed -i 's/stringone/StrIngTwo/g'

Ayrıca, özyineleme derinliğini sınırlamak isterseniz, sınırları da belirleyebilirsiniz:

find /path/to/searchdir/ -name "serachpatter" -type f -maxdepth 4 -mindepth 2 | xargs sed -i 's/stringone/StrIngTwo/g'


0
2017-07-24 17:31



bulmak / yol / için / searchdir / -name "serachpatter" -type f -maxdepth 4 -mindepth 2 | xargs sed -i '/ stringone / StrIngTwo / g' - RedPrajapati
Gelecekte, lütfen altında bir yorum göndermek yerine cevabınızı düzenleyin. Ayrıca, lütfen uygun kodu biçimlendirin; Kod için kalın biçimlendirilmiş metin kullanmayın. - pat-s


bundan daha basit.

for i in `find *` ; do sed -i -- 's/search string/target string/g' $i;

tamam

find i => klasördeki tüm dosyaları ve alt klasörlerde SED'yi tanıtacaktır.

sed -i  => varsa, ilgili dizede dosyaların yerini alacak.


0
2018-03-18 09:32