Sed komutunda -e'nin amacı nedir?


41

sed -eAnahtar hakkında herhangi bir belge bulamıyorum , basit bir değişiklik için gerekli mi?

Örneğin

sed 's/foo/bar/'

VS

sed -e 's/foo/bar/'

14
Bunu bulamadığına emin misin man sed?

4
Potongs açıklama bulamazsınız, neden "cmd1; cmd2" kullanmamalısınız
kullanıcı bilinmeyen kullanıcı

Yanıtlar:


28

Man sayfasından:

-e script, --expression=script

    add the script to the commands to be executed

Böylece -ebirçok bölümden bir komut dosyası oluşturmak için birden çok seçenek kullanabilirsiniz .

$ sed -e "s/foo/bar/" -e "/FOO/d"

İlk yerini alacak fooolan barve ardından içeren her satırı silin FOO.


3
Yani, sadece bir senaryonuz varsa '-e'ye ihtiyacınız yok, değil mi?
JohnyTex

Ben de gerçek amacını -e
arıyorum

27

Bu sizin için işe yarayabilir:

sed -e '/foo/i\' -e 'bar' -e '/fred/a\' -e 'barny' -e '/harry/c\' -e 'potter' file

Her durumda i(insert), a(append) ve c(change) komutlarının newline ile sonlandırılması gerekir.

Normal olarak komutlar bir ;eg ile ayrılabilir /foo/d;/bar/dve {...} eg ile gruplandırılabilir, /foo/{h;d}ancak i,a,ckomutlar -eiçin komutları ayırmanın bir yolunu sağlar.

Alternatif, yeni bir satır eklemek için kabuğu (bash) kullanmaktır:

sed '/foo/i\bar'$'\n''/fred/a\barney'$'\n''/harry/c\potter' file

1
En azından bazı sed uygulamalarında (örneğin, FreeBSD'de), etiketleri ve dal komutlarını -enoktalı virgül yerine newlines / kullanarak sonlandırmanız gerekir . Bu işe yaramaz: sed ':a; /x/ { s/x/y/g; ba }; q' <<< "jxm". Ama bu olacak:sed -e ':a' -e '/x/ { s/x/y/g; ba' -e '}; q' <<< "jxm"
dubiousjim 16:12

must be terminated with a newlineBuradaki ifadenin ne kadar gerekli olduğundan emin değilim . Ben burada test ettiğimizde benim cygwin, bu çalışır: sed '/foo/i\bar' file. Şimdi, ayrı ifadeleri bir araya getirip birleştirebiliyoruz, bu tekrar asıl soruya dönüyor: Asıl amaç nedir -e?
typelogic

1

-e, --expressionbaşka bir Cevapta gösterildiği gibi, birkaç ifadeyi bir araya getirmediğiniz sürece (ortak değil) , eşittir , isteğe bağlıdır .

Bir kenara: Birbiri ;ardına birkaç ifade yürütmek için aynı ifadede yerine kullanılabilir.


0

Bu yardımın sedsize yardım edebileceğini göreceksiniz -e:

 -e script, --expression=script
                 add the script to the commands to be executed

Ancak karşılaşmadan sonra aklınıza ilk gelenler siz değilsiniz -e. Örneğinizde sed 's/foo/bar/'ve sed -e 's/foo/bar/'eşdeğerdir. Her iki durumda s/foo/bar/da sed tarafından yürütülen komut dosyasıdır . İkinci seçenek daha açık olmakla birlikte, sıklıkla -ekullanıldığını görmenin nedeni bu değildir . Bunun nedeni -e, aynı çağrı ile birden fazla komut dosyasının kullanılmasını mümkün kılmasıdır sed. Bu hala tek bir komut dosyası kullanıyorsanız neden kullandığınız sorusunu bırakıyor? Aşağıdaki örnek bunu açıklayabilir:

echo "foo" | sed -e 's/foo/bar/' -e 's/bar/foo'

"Foo" yazacaktır.

Ancak,

echo "foo" | sed 's/foo/bar/' -e 's/bar/foo'

başarısız olur çünkü şimdi sedilkini s/foo/barbir dosya adı olarak yorumluyor . Bu nedenle, gelecekteki hayatınızı kolaylaştırmak için -ebugün bayrağını kullanmaya başlayabilirsiniz . Bu şekilde, komutu kullanarak komutları fazladan bir komut dosyası ile ekleyebilirsiniz -e <script>.

Not: Diğer cevaplarda ;çoklu komut dosyası kullanmanın bir alternatifi olarak kullanılması önerilmiştir. Bu teknik olarak bazı durumlarda mümkün olsa da, teşvik edilmez, çünkü hızlı bir şekilde kod okumayı çok zorlaştırır. Burada bir örneğe bakın: https://www.grymoire.com/Unix/Sed.html#uh-61

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.