yerinde tartışma için çoklu ifade ile sed


24

Dosyadaki birden çok sözcüğü kullanarak değiştirmeye çalışıyorum sed -i #expression1 #expression2

dosya

Something  123 item1
Something  456 item2
Something  768 item3
Something  353 item4

Çıktı (İstenilen)

anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4

-Çıkışları deneyin

Aşağıdaki çıktıyı sed -i2 kez kullanarak alabilirim .

 sed -i 's/Some/any/g' file
 sed -i 's/item/stuff/g' file

Bunu tek bir yerinde komut gibi yapmak için olası herhangi bir yol alabilir miyim

sed -i 's/Some/any/g' -i 's/item/stuff/g' file

Yukarıdaki kodu denediğimde s/item/stuff/gbir dosya olarak alıyor ve üzerinde çalışmayı deneyin.


Eğer dosyalarınız yukarıdaki örneğe benziyorsa (yani aynı deseni izlerlerse), tek bir değişiklikle yapabilirsiniz:sed - i 's/Some\(.*\)item/any\1stuff/' file
don_crissti

Yanıtlar:


26

Sisteminizin sürümüne bağlı olarak, sedyapabilecekleriniz

sed -i 's/Some/any/; s/item/stuff/' file

Buradaki gkomuttaki son bölümden sonra ihtiyacınız syok, çünkü her satırda yalnızca bir tane değiştirme yapıyorsunuz.

Alternatif:

sed -i -e 's/Some/any/' -e 's/item/stuff/' file

-iSeçenek söyler sedyerinde düzenlemek dosyalarına; hemen sonra karakterler varsa, -io zaman sedorijinal dosyanın yedeğini alır ve bu karakterleri yedekleme dosyasının uzantısı olarak kullanır. Örneğin,

sed -i.bak 's/Some/any/; s/item/stuff/' file

veya

sed -i'.bak' 's/Some/any/; s/item/stuff/' file

değiştirerek fileorijinali kaydeder file.bak.

Tabii ki, bir Unix (veya Unix benzeri) sistemde normalde '.bak' yerine '~' kullanırız.

sed -i~ 's/Some/any/;s/item/stuff/' file

2
GNU değişkenini tanımladığınızı unutmayın. BSD değişkeni (FreeBSD veya OS / X'deki gibi) için bir argüman gerektirir-i . Öyle sed -i '' 's/a/b/;s/c/d/' fileya sed -i .back 's/a/b/;s/c/d/'da sed -i.back 's/a/b/;s/c/d/'orada. Diğer seduygulamalar genellikle desteklemez -i.
Stéphane Chazelas,

Bunu netleştirmek için @ StéphaneChazelas'a teşekkürler. Ve sanırım GNU sed'de uzantı ile uzatma arasında boşluk olamayacağını söylerken daha açık olmalıydım -i.
PM 2Ring

sed -i 's/$username = "root"/$username = "newuser"/; s/$password = "password"/$password = "passwd"/; s/$dbname="handicraftstore"/$dbname="handicraft"' Web/database.phpsonuçları sed: -e expression #1, char 141: unterminated s'command`
alhelal

@alhelal Üzgünüz, yorumlar soru sormak için uygun bir yer değil. Neyse, son semrin sonunu kaçırıyor /.
PM 2Ring

@ PM2Ring sizin çözümünüzle ilgili olduğunu tahmin ettiğimi farketmediğim gibi. Ancak teşekkür ederim.
alhelal

10

Sed ifadelerini ";" ile birlikte zincirleyebilirsiniz.

%sed -i 's/Some/any/g;s/item/stuff/g' file1
%cat file1
anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4

5

Birden çok -eseçenek kullanarak birden çok ifade :

sed -i.bk -e 's/Some/any/g' -e 's/item/stuff/g' file

ya da sadece birini kullanabilirsiniz:

sed -i.bk -e 's/Some/any/g;s/item/stuff/g' file

OSX sedsed gibi bazı uygulamaların boş uzantıyla çalışmadığından ( orijinal dosyaları geçersiz kılmak için kullanmanız gerekir) olduğundan, yedekleme dosyası için bir uzantı vermelisiniz .sed -i ''


1

Vim'i Ex modunda kullanabilirsiniz:

ex -sc '%s/Some/any/|%s/item/stuff/|x' file
  1. % tüm satırları seç

  2. s vekil

  3. x kaydet ve kapat

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.