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 r
EAD komut hattı sayısı ile tatbik edilir.
Çevresinde alabilirsiniz:
echo | sed -e '$d;N;P;/\nPointer/r file1' -e D file2 -
Tüm sed
ler yorumlayacaktır -
standart girdi, ancak birçok do anlamında. ( POSIX , uygulayıcı standart-giriş demek istiyorsa standart giriş yapmayı sed
desteklemeli diyor ?)-
-
Başka bir yol da eklenen içeriği sırayla ele almaktır. Orada başka bir komuttur programları aynı şekilde çıktı r
EAD yapar ve sed
onu ve uygulayacaktır r
onlar senaryosunu sırayla inceliyoruz EAD. O birini kullanarak gerektirir - Yine biraz daha yer var sed
etmek a
ppend Pointer
diğerinin çıkışına maçı sed
kendi 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ığı sed
bir komut dosyasını yazar . İlki, yalnızca bulunan ilk eşleşmede çalışır ve daha sonra girdiyi bırakır. Görevi ...sed
sed
Pointer
q
s/[]^$&\./*[]/\\&/g;H
- Tüm desen karakterlerinin güvenli bir şekilde ters eğik çizgiden kaçtığından emin olun, çünkü ikincisi
sed
kelimenin tam anlamıyla doğru yapmak için okuduğu her biti yorumlamalıdır. Bu işlem bittikten sonra H
eski alana kopyalayın .
s|.*|/&/!p;//!d|p; x
- İkinci söyle
sed
için p
her giriş hattını Rint !
ama /&/
biz sadece desen safed birini; ve sonra d
aynısını seçmek için. p
komutları ikinci adımda uygulayın sed
, sonra eski ve kalıp tamponlarını kaydedilmiş kopyamız üzerinde çalışacak şekilde x
değiştirin h
.
s|.|r file1&a\\&|p;q
- Burada birlikte çalıştığımız tek karakter bir
\n
ip çizgisi çünkü sed
daha H
önce çizgiyi belirlediğimizde bir tane hazırlamış olacak . Biz komutu eklemek Yani r file1
bizim ile onu takip \n
ewline sonra komut a\\
için a
ppend bir tarafından da takip \n
ewline. Alan çizgimizin geri kalanının tamamı H
bu son satırda izler \n
.
İlk yazdığı senaryo şuna benzer:
/Pointer-file2 "23"/!p;//!d
r file1
a\
Pointer-file2 "23"
Temel olarak ikincisi sed
her satırı yazdırır, ancak ilk satır ppend sed
için a
ayarlar. Söz konusu hat için iki standart aşımı bulundukları Gecikmeli yazma planlanan - ilk r
ve ead file1
ve ikinci biz ondan sonra istediğiniz satırın bir kopyasıdır. İlk sed
doktorun 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.