Yanıtlar:
OS X, BSD ve GNU araçlarının bir karışımını kullanır, bu nedenle en iyisi her zaman belgeleri kontrol edin (yine less
de OS X kılavuzuna uymayan bile olsa):
sed, -i
yedeklemelerin uzantısı olarak sonra argümanı alır . -i ''
Yedekleme yapılmaması için boş bir dize ( ) sağlayın .
Aşağıdakiler yapmalıdır:
LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
Bu -type f
sadece iyi bir uygulamadır; ona bir dizin verirseniz sed şikayet eder.
-exec
tercih edilir xargs
; -print0
herhangi bir şeyle uğraşmanıza gerek yok . {} +
Uç araçlarının en find
yerine denilen komuta tek bir örnek olacak argümanlar gibi tüm sonuçları ekler Her sonuç için onu yeniden çalışan. (Bir istisna, işletim sistemi tarafından izin verilen maksimum sayıda komut satırı argümanının ihlal edilmesidir; bu durumda find
birden fazla örnek çalıştırılır.)
%
: karakterini kullanabilirsiniz sed "s%localhost/site%blah/blah%"
. Başka bir alternatif ayırıcısını kullanılan karakterler-kaçış etmektir: sed "s/localhost\/site/blah\/blah/"
.
illegal byte sequence
hata alan var mı? eğer öyleyse, deneyin: LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
benim için çalıştı.
/g
gibi birden ocurrencies içinLC_ALL=C find . -type f -exec sed -i '' s/search/replace/g {} +
Mac için daha benzer bir yaklaşım şu olacaktır:
find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"
find . -name '*.php' -print0 | xargs -0 sed -i "" "s/easyform/form360/g"
Alternatif bir çözüm olarak, bunu Mac OSX 10.7.5'te kullanıyorum
grep -ilr 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @
Kredi: Todd Cesere'nin cevabı
Yukarıdakilerin hiçbiri OSX üzerinde çalışmaz.
Aşağıdakileri yapın:
perl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.txt
Hem Linux hem de Mac OS X üzerinde çalışan bir sürüm ( -e
anahtarı ekleyerek sed
):
export LC_CTYPE=C LANG=C
find . -name '*.txt' -print0 | xargs -0 sed -i -e 's/this/that/g'
export LC_CTYPE=C && export LANG=C
Bu komutu ne zaman yazsam her zaman hortumla dolduruyor veya bir bayrağı unutuyorum. TaylanUB'un cevabından yola çıkarak github'da bir Gist oluşturdum ve mevcut dizinden genel bir bulma değişikliği yapıyor. Bu, Mac OSX'e özgüdür.
https://gist.github.com/nateflink/9056302
Güzel, çünkü şimdi bir terminal açıp sonra kopyaladım:
curl -s https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | bash -s "bul-a-url.com" "değiştir-a-url.com"
Bazı garip bayt dizisi hataları alabilirsiniz, işte tam kod:
#!/bin/bash
#By Nate Flink
#Invoke on the terminal like this
#curl -s https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | bash -s "find-a-url.com" "replace-a-url.com"
if [ -z "$1" ] || [ -z "$2" ]; then
echo "Usage: ./$0 [find string] [replace string]"
exit 1
fi
FIND=$1
REPLACE=$2
#needed for byte sequence error in ascii to utf conversion on OSX
export LC_CTYPE=C;
export LANG=C;
#sed -i "" is needed by the osx version of sed (instead of sed -i)
find . -type f -exec sed -i "" "s|${FIND}|${REPLACE}|g" {} +
exit 0
Bir zsh terminali kullanıyorsanız, joker karakter sihrini kullanabilirsiniz:
sed -i "" "s/search/high-replace/g" *.txt
Bu biçimi kullandım - ama ... Son derece garip bulduğum her örneği gerçekten değiştirmek için onu üç veya daha fazla kez çalıştırmam gerektiğini fark ettim. Bir kez çalıştırmak her dosyada bazılarını değiştirir, ancak hepsinde değil. Tam olarak aynı dizeyi iki-dört kez çalıştırmak tüm örnekleri yakalar.
find . -type f -name '*.txt' -exec sed -i '' s/thistext/newtext/ {} +
g
, çünkü sed regex'inizin sonunda a'ya ihtiyacı var , aksi takdirde yalnızca thistext
bir satırdaki ilk geçtiği yerin yerini alır . Yani normal ifadeniz şöyle olmalıdırs/thistext/newtext/g
https://bitbucket.org/masonicboom/serp , OSX üzerinde test edilmiş, belirli bir dizindeki dosyalardaki metinler için yinelemeli arama ve değiştirme yapan ve her bir değişikliği onaylayan bir go yardımcı programıdır (yani çapraz platform). Yeni, buggy olabilir.
Kullanım şöyle görünür:
$ ls test
a d d2 z
$ cat test/z
hi
$ ./serp --root test --search hi --replace bye --pattern "*"
test/z: replace hi with bye? (y/[n]) y
$ cat test/z
bye
find . -type f | xargs sed -i '' 's/string1/string2/g'
Daha fazla bilgi için buraya bakın .
OSX'teki komut, güzel kullanıcı arayüzündeki Unix ile tamamen aynı olmalıdır.
-print0
ilave find
bayrakları ve -0
karşı xargs
bayraklar.
-exec sed -i s/this/that/g {} \+
yerine de kullanabilirsiniz-print
xargs
, alanla sınırlanmış "./jacobus" dosyasını aktarılacak bir dosya olarak sed
ve ardından "R.txt" ile görebilir. hiçbiri yok.
"" yerine $ PWD diyebilirsiniz.
apple.stackexchange.com
Linux veya tüm geliştiriciler için yeterince genel olmadığından, muhtemelen taşınmalıdır .