Üç farklı sedkomut:
sed '$!N;s/"[^"]*"\n<[^>]*>/other characters /;P;D'
sed -e :n -e '$!N;s/"[^"]*"\n<[^>]*>/other characters /;tn'
sed -e :n -e '$!N;/"$/{$!bn' -e '};s/"[^"]*"\n<[^>]*>/other characters /g'
Her üçü de temel s///ikame komutunu temel alır:
s/"[^"]*"\n<[^>]*>/other characters /
Ayrıca sed, kenar çizgilerindeki çıkışlarında farklılık gösterme eğilimi gösterdiğinden , son çizgiyi ele alırken de dikkatli olmaya çalışırlar . Bunun anlamı , son olmayan $!her satırla eşleşen bir adresdir .!$
Ayrıca N, \newline karakterini izleyen desen alanına bir sonraki giriş satırını eklemek için ext komutunu kullanırlar . Kalmış olan herkes sedbir süre ing güvenmek öğrenmiş olacak \newline karakteri - tek yol almak için çünkü biri açıkça oraya koymaktır.
Her üçü de harekete geçmeden önce mümkün olduğunca az girdi okumaya çalışırlar - mümkün olan seden kısa sürede davranır ve bunu yapmadan önce tüm girdi dosyasında okuması gerekmez.
Her şeyi yapsalar da N, her üçü de özyineleme yöntemlerinde farklılık gösterir.
İlk Komut
İlk komut çok basit bir N;P;Ddöngü kullanır . Bu üç komut POSIX uyumlu herhangi bir yerleşiktir sedve birbirlerini güzel şekilde tamamlarlar.
N- daha önce de belirtildiği gibi, Ndahili bir giriş hattını, eklenen bir \newline sınırlayıcıyı izleyerek desen alanına ekler .
P- gibi p; o Pama sadece ilk çıkan yukarı-to - desen alanı rints \newline karakteri. Ve böylece, aşağıdaki giriş / komut verildiğinde:
printf %s\\n one two | sed '$!N;P;d'
sed Psadece birini çizer . Ancak, ...
D- gibi d; o Ddesen alanı eletes ve başka hat-çevrim başlar. Aksine d , desen uzayında Dsadece ilk oluşan \newline'a kadar siler . \nEwline karakterini takip eden desen alanında daha fazlası varsa sed, bir sonraki satır döngüsüne geriye kalanla başlar. Eğer dönceki örnekte bir ile değiştirilmiştir D, örneğin, sedolur Phem Rint birini ve ikisini .
Bu komut sadece hatlar için recurses yok maç s///ubstitution deyimi. Çünkü s///ubstitution kaldırır \nile eklenen ewline N, zaman kalan asla bir şey var mı sed Deletes desen alanı.
PVe / veya Dseçici olarak uygulamak için testler yapılabilir , ancak bu stratejiye daha uygun başka komutlar da vardır. Özyineleme sadece maç üst üste çizgileri işlemek için uygulanan Çünkü bölümünü yedek kuralının, eşleştirme hatlarının birbirini izleyen diziler iki ucunu bir s///ubstitution iyi çalışmaz .:
Bu girdi verildiğinde:
first "line"
<second>"line"
<second>"line"
<second>line and so on
... yazdırıyor ...
first other characters "line"
<second>other characters line and so on
Bununla birlikte,
first "line"
second "line"
<second>line
... gayet iyi.
İkinci Komut
Bu komut üçüncüye çok benzer. Hem istihdam bir :bçiftlik / test etiket (aynı zamanda joeseph R. cevabı gösterilmiştir burada ) buna ve recurse geri belirli koşulları verilmiş.
-e :n -e- taşınabilir sedkomut dosyaları :etiket tanımını \newline veya yeni satır içi xecution -edeyimi ile sınırlar.
:n- adlı bir etiketi tanımlar n. Bu herhangi bir zamanda bnveya ile döndürülebilir tn.
tn- etiket tanımlandığından veya son olarak ests başarılı olarak adlandırıldığından bu yana herhangi bir ikame olursa test komutu belirtilen bir etikete döner (veya hiçbiri sağlanmazsa, geçerli satır döngüsü için komut dosyasından çıkar) .s///t
Bu komutta, eşleşen satırlar için özyineleme gerçekleşir. Eğer sedbaşarılı olan desen değiştirir diğer karakterler , seddönüşlerin :ntekrar etiket ve denemeden. Bir s///yerine sedkoyma gerçekleştirilmezse, desen uzayını otomatik yazdırır ve bir sonraki satır döngüsünü başlatır.
Bu, ardışık dizileri daha iyi ele alma eğilimindedir. Sonuncusu başarısız olduğunda, bu yazdırır:
first other characters other characters other characters line and so on
Üçüncü Komut
Belirtildiği gibi, buradaki mantık sonrakine çok benzer, ancak test daha açıktır.
/"$/bn- bu bir sedtest. Çünkü bçiftliğin komutu bu adresin bir fonksiyonudur, sedsadece olacak bnedeniyle çiftlik geri :nbir sonraki \newline eklenmiş ve desen uzay hala ile bitiyor "ikili tırnak.
Mümkün olduğu kadar Nve arasında çok az şey yapılır b- bu şekilde sed, aşağıdaki satırın kuralınızla eşleşemediğinden emin olmak için gerektiği kadar çok hızlı bir şekilde tam olarak toplanabilir. s///Burada istihdam ki ubstitution farklılık gaynı anda tüm gerekli değiştirmeler yapacağız böylece ve - lobal bayrağı. Aynı giriş verildiğinde bu komut sonuncuya aynı şekilde çıkış verir.
\ni sormak neden yapmak ewline ifadedir. insanlar nadirens//\n/GNU ile yapabildiklerini yapıp yapamayacaklarını sorsa dased, çoğu diğer kişisedsağ taraftaki bu kaçışı reddedecektir. yine de,\nkaçış herhangi bir POSIX'te solda çalışacaksedve bunlarıy/c/\n/aynı etkiye sahip olacak gibi portatif olarak çevirebilirsinizs/c/\n/gve bu yüzden her zaman yararlı değildir.