Üç farklı sed
komut:
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
, \n
ewline karakterini izleyen desen alanına bir sonraki giriş satırını eklemek için ext komutunu kullanırlar . Kalmış olan herkes sed
bir süre ing güvenmek öğrenmiş olacak \n
ewline 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 sed
en 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;D
döngü kullanır . Bu üç komut POSIX uyumlu herhangi bir yerleşiktir sed
ve birbirlerini güzel şekilde tamamlarlar.
N
- daha önce de belirtildiği gibi, N
dahili bir giriş hattını, eklenen bir \n
ewline sınırlayıcıyı izleyerek desen alanına ekler .
P
- gibi p
; o P
ama sadece ilk çıkan yukarı-to - desen alanı rints \n
ewline karakteri. Ve böylece, aşağıdaki giriş / komut verildiğinde:
printf %s\\n one two | sed '$!N;P;d'
sed
P
sadece birini çizer . Ancak, ...
D
- gibi d
; o D
desen alanı eletes ve başka hat-çevrim başlar. Aksine d
, desen uzayında D
sadece ilk oluşan \n
ewline'a kadar siler . \n
Ewline 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, sed
olur P
hem Rint birini ve ikisini .
Bu komut sadece hatlar için recurses yok maç s///
ubstitution deyimi. Çünkü s///
ubstitution kaldırır \n
ile eklenen ewline N
, zaman kalan asla bir şey var mı sed
D
eletes desen alanı.
P
Ve / veya D
seç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 / t
est etiket (aynı zamanda joeseph R. cevabı gösterilmiştir burada ) buna ve recurse geri belirli koşulları verilmiş.
-e :n -e
- taşınabilir sed
komut dosyaları :
etiket tanımını \n
ewline veya yeni satır içi xecution -e
deyimi ile sınırlar.
:n
- adlı bir etiketi tanımlar n
. Bu herhangi bir zamanda bn
veya 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 t
est 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 sed
başarılı olan desen değiştirir diğer karakterler , sed
dönüşlerin :n
tekrar etiket ve denemeden. Bir s///
yerine sed
koyma 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 sed
test. Çünkü b
çiftliğin komutu bu adresin bir fonksiyonudur, sed
sadece olacak b
nedeniyle çiftlik geri :n
bir sonraki \n
ewline eklenmiş ve desen uzay hala ile bitiyor "
ikili tırnak.
Mümkün olduğu kadar N
ve 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 g
aynı 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.
\n
i sormak neden yapmak ewline ifadedir. insanlar nadirens//\n/
GNU ile yapabildiklerini yapıp yapamayacaklarını sorsa dased
, çoğu diğer kişised
sağ taraftaki bu kaçışı reddedecektir. yine de,\n
kaçış herhangi bir POSIX'te solda çalışacaksed
ve bunlarıy/c/\n/
aynı etkiye sahip olacak gibi portatif olarak çevirebilirsinizs/c/\n/g
ve bu yüzden her zaman yararlı değildir.