Bir dosyada kalıcı değişiklikler yapmak için sed komutumu nasıl alabilirim?


32

Mümkün mü? Aşağıdaki komutun yapabileceği bir yerde okudum:

sed -e [komut] [dosya]

ama sadece aynı şeyi yapmak gibiydi

sed [komut] [dosya]

(değişiklikleri kaydetmedi). Sed kullanarak bunu yapmanın bir yolu var mı?


2
-eBayrak ekspresyonu ifade eder. Muhtemelen bu -ibayrakları in-placeistiyorsunuz ve kullanmanızı şiddetle tavsiye ediyorum sed -i.bak 's/../' filename
Valentin Bajrami,

Yanıtlar:


50

Bence aradığınızı düşünüyorum -i:

   -i[SUFFIX], --in-place[=SUFFIX]

          edit files in place (makes backup if SUFFIX supplied)

Örneğin:

$ cat foo.txt
hello world
$ sed -i 's/o/X/g' foo.txt
$ cat foo.txt
hellX wXrld

Bir sonek sağlarsanız, bir yedekleme dosyası oluşturur:

$ ls
foo.txt
$ sed -i.bak 's/o/X/g' foo.txt 
$ ls
foo.txt  foo.txt.bak

Giriş dosyası değiştirilmiş ve orijinal dosya verilerini içeren bir yedekleme oluşturulmuştur.

Ayrıca, bu GNU için olduğuna dikkat sedvardır, küçük farklar farklı arasındaki biçiminde seduygulamaları.


4
Man sayfasının yanlış olduğuna dikkat edin. sedyerinde düzenleme yapmaz. Yeni bir dosya oluşturur ve eskisinin üzerine yazar, inode değişir.
Marco

2
@Marco Yerinde bir dosyayı düzenlemenin güvenli yolu. Sed belgelerinde “bir dosyayı yerinde düzenleme”, orijinal dosyanın (inode tarafından tanımlandığı gibi) değil, orijinal dosyanın (adıyla tanımlandığı gibi) değiştirildiği anlamına gelir.
Gilles 'SO- kötü olmaktan'

2
@Gilles Bunun bir dosyayı düzenlemek için tercih edilen bir yol olduğu konusunda hemfikirim, ancak bunu yerinde söylemek zor . Ancak bu, bir dosyanın inode ya da name ile nasıl tanımlandığı sorusuna yol açıyor. İnode ile söyleyebilirim ki, aksi takdirde yapılanmalar cmd'nin { rm file; cmd > file; } < fileokuduğu ve aynı dosyaya yazdığı sonucuna yol açacaktır. Aynı adı taşıyan iki farklı dosya. Fakat burada bir tartışma başlatmak istemiyorum.
Marco

MacOS 10.14'te sed: 1: "foo.txt": invalid command code fçalışırken alırım sed -i 's/o/X/g' foo.txt. Ancak, bir uzantı sağlamak gibi, sed -i .bak 's/o/X/g' foo.txtiyi çalışıyor. Yedek dosyaları oluşturmadan nasıl çalışacağını bilen var mı?
Joshua Pinter

1
Tamam, anladım. MacOS'ta uzatma param seçeneği için açıkça boş bir dize eklemeniz gerekir:sed -i '' 's/o/X/g' foo.txt
Joshua Pinter


1

-eseçenek birden fazla sedkomut çalıştırmak içindir

sed -e 's/linux/unix/' -e 's/os/OS/' file.txt

dikkate file.txtolarak

linux os

o zaman O / P

unix os

-i seçenek kalıcı olarak değişiklikleri kaydeder ...

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.