Bu konuda devam etmek için birkaç yol var sed. Bunun bir yolu, kabul edilen cevapta önerilen şekilde gecikmeli bir okumadır. Ayrıca şöyle yazılabilir:
sed -e '$!N;P;/\nPointer/r file1' -e D file2
... başka bir yerde tutma tamponu ile uygulanan geriye dönük görünüm yerine biraz belirgin bir görünüm ile. Bu nedeniyle kaçınılmaz olarak @don_crissti notları, ancak, bu son hat ile aynı sorun olacaktır N yapar hattı döngüsü arttırma ve rEAD komut hattı sayısı ile tatbik edilir.
Çevresinde alabilirsiniz:
echo | sed -e '$d;N;P;/\nPointer/r file1' -e D file2 -
Tüm sedler yorumlayacaktır -standart girdi, ancak birçok do anlamında. ( POSIX , uygulayıcı standart-giriş demek istiyorsa standart giriş yapmayı seddesteklemeli diyor ?)--
Başka bir yol da eklenen içeriği sırayla ele almaktır. Orada başka bir komuttur programları aynı şekilde çıktı rEAD yapar ve sedonu ve uygulayacaktır ronlar senaryosunu sırayla inceliyoruz EAD. O birini kullanarak gerektirir - Yine biraz daha yer var sedetmek append Pointerdiğerinin çıkışına maçı sedkendi komut.
sed ' /Pointer/!d #only operate on first match
s/[]^$&\./*[]/\\&/g;H #escape all metachars, Hold
s|.*|/&/!p;//!d|p;g #print commands, exchange
s|.|r file1&a\\&|;q' file2| #more commands, quit
sed -nf - file2 #same input file
Bu nedenle, temel olarak birincisi sed, ikinciye standart girdiyi (belki ...) okuduğu ve sırayla uyguladığı sedbir komut dosyasını yazar . İlki, yalnızca bulunan ilk eşleşmede çalışır ve daha sonra girdiyi bırakır. Görevi ...sedsedPointerq
s/[]^$&\./*[]/\\&/g;H
- Tüm desen karakterlerinin güvenli bir şekilde ters eğik çizgiden kaçtığından emin olun, çünkü ikincisi
sedkelimenin tam anlamıyla doğru yapmak için okuduğu her biti yorumlamalıdır. Bu işlem bittikten sonra Heski alana kopyalayın .
s|.*|/&/!p;//!d|p; x
- İkinci söyle
sediçin pher giriş hattını Rint !ama /&/biz sadece desen safed birini; ve sonra daynısını seçmek için. pkomutları ikinci adımda uygulayın sed, sonra eski ve kalıp tamponlarını kaydedilmiş kopyamız üzerinde çalışacak şekilde xdeğiştirin h.
s|.|r file1&a\\&|p;q
- Burada birlikte çalıştığımız tek karakter bir
\nip çizgisi çünkü seddaha Hönce çizgiyi belirlediğimizde bir tane hazırlamış olacak . Biz komutu eklemek Yani r file1bizim ile onu takip \newline sonra komut a\\için append bir tarafından da takip \newline. Alan çizgimizin geri kalanının tamamı Hbu son satırda izler \n.
İlk yazdığı senaryo şuna benzer:
/Pointer-file2 "23"/!p;//!d
r file1
a\
Pointer-file2 "23"
Temel olarak ikincisi sedher satırı yazdırır, ancak ilk satır ppend sediçin aayarlar. Söz konusu hat için iki standart aşımı bulundukları Gecikmeli yazma planlanan - ilk rve ead file1ve ikinci biz ondan sonra istediğiniz satırın bir kopyasıdır. İlk seddoktorun doktoru bu durumda bile gerekli değildir (bakınız? Ters eğik çizgi yok) ancak bir desen eşleşmesi girdi olarak tekrarlandığında burada yaptığım şekilde güvenli bir şekilde kaçmak önemlidir.
Neyse, yani ... birkaç yol var.