Dizin ve alt dizinlerde sed ile bul ve değiştir


244

Sitemin kökündeki tüm dosyalarda 'elma' ile ilgili tüm oluşumları 'turuncu' bulmak ve değiştirmek için bu komutu çalıştırıyorum:

find ./ -exec sed -i 's/apple/orange/g' {} \;

Ancak alt dizinlerden geçmez.

Bu komutta sorun nedir?

İşte bazı çıktı satırları find ./:

./index.php
./header.php
./fpd
./fpd/font
./fpd/font/desktop.ini
./fpd/font/courier.php
./fpd/font/symbol.php

Çalıştırıp find ./bazı örnek çıktılar gönderebilir misiniz ? Ve dizin yapısı lütfen. düzenleme: teşekkürler!
Jacob

Bulunduğunuz yer doğru, alt dizinlerle benim için çalışıyor.
Jacob

1
Alt dizinleri işlemediğini nasıl anlarsınız?
carlpett

çünkü bu hataları verir: sed: ./fpd: normal bir dosyayı düzenleyemedi sed: ./fpd/font: düzenlenemedi. normal bir dosya değil sed: ./fpd/font/makefont düzenleyemedi: bir düzenleme değil
hd.

oh ... elma için grep ve hiçbir şey bulunamadı. hepsi değiştirildi. ;) teşekkür ederim . gözlerimi açtın !!!
hd.

Yanıtlar:


422

Bulmanız, dizin adlarını sed'e göndermekten kaçınmak için şöyle görünmelidir:

find ./ -type f -exec sed -i -e 's/apple/orange/g' {} \;

19
Sen değiştirmeniz gerekebilir sed -i 's/apple/orange/g'için sed -i '' 's/apple/orange/g'bu işi yapmak için.
paulmelnikow

7
-ibağımsız değişken alır: geçici dosyayı kaydetmek için kullanılan uzantı. GNU sed'de, -iargümanı ile argümanı arasında boşluk yok gibi görünüyor , ama BSD sed'de… BSD GNU'ya -i '' 's/foo/bar/'eşdeğer -i 's/foo/bar/.
paulmelnikow

20
Aslında ekleme -eMac OS'de çalışmaz. touch a b c d eKomut yukarıdaki böyle bir dizin listesi üretir ardından: a a-e b b-e c c-e d d-e e e-e.
14:22, paulmelnikow

6
Mac OS için, bu yanıt stackoverflow.com/questions/19242275/… theRE error: illegal byte sequence
kakoma

3
Balık kabuğu kullanıcıları için, boş parantezleri alıntıladığınızdan emin olun '{}', çünkü balık alıntı yapılmadığında boş parantezleri otomatik olarak genişletir.
Kevin Cherepski

84

Daha büyük s & r görevleri için grep ve xargs kullanmak daha iyi ve daha hızlıdır, örneğin;

grep -rl 'apples' /dir_to_search_under | xargs sed -i 's/apples/oranges/g'

20
Bu cevap için teşekkürler, çok yardımcı oldu! Git deposunda ise, kullanmak daha da hızlıgit grep -l 'apples' | xargs sed -i 's/apples/oranges/g'
mrodrigues 21

4

Bu benim için çalıştı:

find ./ -type f -exec sed -i '' 's#NEEDLE#REPLACEMENT#' *.php {} \;

orijinal soru * .php dosyalarıyla sınırlı değildir, ayrıca bir .ini one
knocte

Alıntılanmamış *.phpolan gerçekten yanlış; başlangıç ​​dizininde genişlemediği için şanslı oldunuz çünkü orada eşleşen dosyalarınız olmadı.
tripleee

3
grep -e apple your_site_root/**/*.* -s -l | xargs sed -i "" "s|apple|orage|"

1

Bunu okuduğum macOS halkı da olduğu için (yaptığım gibi), aşağıdaki kod benim için çalıştı (10.14'te)

egrep -rl '<pattern>' <dir> | xargs -I@ sed -i '' 's/<arg1>/<arg2>/g' @

MacOS kullanan -ive -eçalışmayan diğer tüm yanıtlar .

Kaynak


0

Bence bunu tek satırlık basit komutla yapabiliriz

for i in `grep -rl eth0 . 2> /dev/null`; do sed -i ‘s/eth0/eth1/’ $i; done

Bu sayfaya bakın .


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.