OS X'te sed ile yerinde düzenlemeler


142

OS X'de sed ile bir dosyayı düzenlemek istiyorum. Aşağıdaki komutu kullanıyorum:

sed 's/oldword/newword/' file.txt

Çıkış terminale gönderilir. file.txt değiştirilmez. Değişiklikler bu komutla file2.txt dosyasına kaydedilir :

sed 's/oldword/newword/' file1.txt > file2.txt

Ancak başka bir dosya istemiyorum. Sadece file1.txt dosyasını düzenlemek istiyorum . Bunu nasıl yapabilirim?

-İ bayrağını denedim. Bu, aşağıdaki hatayla sonuçlanır:

sed: 1: "file1.txt": invalid command code f

2
-iBayrağı denediğinizde kullandığınız komut tam olarak nedir ?
eldarerathis

Yanıtlar:


282

-iBayrağı yedeklenen dosyaya eklemek için bir sonek vererek doğru şekilde kullanabilirsiniz . Örneğinizi genişletme:

sed -i.bu 's/oldword/newword/' file1.txt

Size iki dosya verir: biri file1.txtikame içeren ad ve diğeri file1.txt.buorijinal içeriğe sahip.

Hafif tehlikeli

Orijinal dosyanın üzerine yıkıcı bir şekilde yazmak istiyorsanız, aşağıdakine benzer bir şey kullanın:

sed -i '' 's/oldword/newword/' file1.txt
      ^ note the space

Satırın ayrıştırma biçimi nedeniyle, seçenek bayrağı ile argümanı arasında boşluk olması gerekir, çünkü argüman sıfır uzunluktadır.

Orijinalinizi çöpe atmak dışında, bu şekilde kandırmanın başka tehlikelerinin farkında değilim. Bununla birlikte, bu çağırma sedbir komut dosyasının parçasıysa, Unix Way ™ 'nin (IMHO) sedtahribatsız olarak kullanacağı , temiz bir şekilde çıkıp çıkmadığını test edeceği ve yalnızca harici dosyayı kaldıracağı belirtilmelidir.


Haklısın -i bayrağından sonra uzantıyı atlıyordum. Mı -i'', potansiyel olarak orijinal dosyayı karışıklık (ve hiçbir geri alma sahip) dışında herhangi bir nedenle tehlikeli?
PazarPazartesi

sedMan sayfasına göre , cihazdaki disk alanınız biterse, bir dosyayı adım ortasında bozabilir ve kötü bir çıktı sonucu elde edebilirsiniz. Yerel kaynak kontrolü altında sed -i ""yedeklemeler olmadan çalışıyorsanız, çoğu zaman iyi olmalıdır (veya git init && git add -A . && git commit -m 'backup'sed -imodunda çalıştırmadan hemen önce ).
cfeduke

2
Hafif tehlikeli parçayı özellikle yararlı buldum. +1
Andre

5
BSD sed -i bayrağından sonra boşluk olmamasını gerektirir. Yani -i''geçerli, ama -i ''değil.
Todd A. Jacobs

3
Ahh! BSD sed '\ n' karakterini görmezden geliyor ve onun yerine 'n' yazıyor! Im sadece benim mac üzerinde GNU sed ile BSD sed yerini alacak!
nterry

20

MacOS ile benzer bir sorunum var

sed -i '' 's/oldword/newword/' file1.txt

çalışmıyor, ama

sed -i"any_symbol" 's/oldword/newword/' file1.txt

iyi çalışıyor.


Bu şimdi tam tersi. sed -i '' <file>çalışıyor ama sed -i'' <file>artık çalışmıyor
Zohaib Amanzai


4

-i''( --in-place) Öğesini seddaha önce önerildiği gibi için kullanabilirsiniz . Bkz: Yerinde argüman , ancak unutmayın seçenek standart olmayan FreeBSD uzantıları ve diğer işletim sistemlerinde mevcut olmayabilir. İkincisi , bir dosya editörü değil , bir S tream ED itor'dur .-i-ised


Alternatif yol, Vim Ex modunda yerleşik ikameyi kullanmaktır, örneğin:

$ ex +%s/foo/bar/g -scwq file.txt

ve birden fazla dosya için:

$ ex +'bufdo!%s/foo/bar/g' -scxa *.*

Tüm dosyaları özyinelemeli olarak düzenlemek için **/*.*, kabuk bunu destekliyorsa (tarafından etkinleştir shopt -s globstar) kullanabilirsiniz.


Başka bir yol kullanmak gawkve yeni "yerinde" uzantısını kullanmaktır :

$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1

4

Bu yedek dosyaları oluşturur. Örneğin sed -i -e 's/hello/hello world/' testfile, benim için, aynı dizinde testfile-e yedek dosyası oluşturur.


Mac OS Catalina için de aynı şey geçerli. -İ ve -e öğelerini ayrı ayrı iletmek (birlikte -ie DEĞİL!) '-E' eklenmiş bir yedek dosya oluşturur.
Daniel Kesner

1

Kullanabilirsiniz:

sed -i -e 's/<string-to-find>/<string-to-replace>/' <your-file-path>

Misal:

sed -i -e 's/Hello/Bye/' file.txt

Bu Mac'te kusursuz çalışır .


2
Bu, Mac OS Catalina'ta benim için '-e' eklenmiş bir yedek dosya oluşturur.
Daniel Kesner

MacOS için bu yanlış. Lütfen oradaki "man sed" sayfasına bir göz atın. -imacOS için bir argüman gerektirir. Birini belirtmediğiniz için -e, -eeklenir ve ikinci bir dosyanın eklenmesiyle sonuçlanır . -emacOS'ta mevcut değil -E. MacOS için doğru komutsed -i '' -E 's/Hello/Bye/' file.txt
Marc J. Schmidt
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.