sed
-e
Anahtar 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/'
sed
-e
Anahtar 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/'
Yanıtlar:
Man sayfasından:
-e script, --expression=script
add the script to the commands to be executed
Böylece -e
birç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 foo
olan bar
ve ardından içeren her satırı silin FOO
.
-e
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/d
ve {...
} eg ile gruplandırılabilir, /foo/{h;d}
ancak i,a,c
komutlar -e
iç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
-e
noktalı 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"
must be terminated with a newline
Buradaki 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
?
Bu yardımın sed
size 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 -e
kullanı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 sed
ilkini s/foo/bar
bir dosya adı olarak yorumluyor . Bu nedenle, gelecekteki hayatınızı kolaylaştırmak için -e
bugü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
man sed
?