Anlamı nedir: a; $! N; sed komutunda?


11
$ (echo hello; echo there) | sed ':a;$!N;s/\n/string/;ta'
hellostringthere

Yukarıdaki sedkomut yeni çizgi karakterini "string" dizesiyle değiştirir. Ama :a;$!N;s/\n/string/;tatek tırnak içinde anlamını bilmiyorum . Orta kısmı biliyorum s/\n/string/. Ama ilk ( :a;$!N;) ve son ( ta) parçanın işlevini bilmiyorum .



Son bölüm ne olacak?
Avinash Raj

Son yedek komut desen alanını değiştirdiğinde "t" komutu adlandırılmış bir etikete dallanır.
xiaodongjie

Yanıtlar:


17

Bunlar, kuşkusuz şifreli sedkomutlardır. Özellikle (kimden man sed):

: label
         b ve t komutları için etiket .

t label
         Eğer ///, son giriş satırı okunduğundan ve son t veya T komutundan bu yana başarılı bir değişiklik yaptıysa, etiketlemek için dallayın; etiket atlanırsa, komut dosyasının sonuna dallanır.

n N Bir sonraki girdi satırını desen alanına okur / ekler.

Böylece, yayınladığınız komut dosyası bölünebilir (okunabilirlik için eklenen alanlar):

sed ':a;  $!N;  s/\n/string/;  ta'
     ---  ----  -------------  --
      |     |        |          |--> go back (`t`) to `a`
      |     |        |-------------> substitute newlines with `string`
      |     |----------------------> If this is not the last line (`$!`), append the 
      |                              next line to the pattern space.
      |----------------------------> Create the label `a`.

Temel olarak, bunun yaptığı şey sahte kodda şu şekilde yazılabilir:

while (not end of line){
    append current line to this one and replace \n with 'string'
}

Daha karmaşık bir giriş örneği ile bunu biraz daha iyi anlayabilirsiniz:

$ printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;$!N;s/\n/string/;ta'
line1stringline2stringline3stringline4stringline5

Neden !$gerekli olduğundan gerçekten emin değilim . Anlayabildiğim kadarıyla, aynı çıktıyı

printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;N;s/\n/string/;ta'

1
! $, Son satırsonu IMO ile eşleşmemelidir.
Braiam

@Braiam bundan emin değil, $!değil !$. Ancak, aynı zamanda olabilir !Nve $!.
terdon

Ben texinfo sayfasını ayrıştırmaya çalışıyordum ama hiçbirine !Nya da referanslar bulamadık $!. Bu yüzden, hala son satırın yeni satır mı yoksa EOF mu olduğunu düşünmeye devam ediyorum.
Braiam

4
Ben düşünmeye çalışın $!bir sonek tamamlayıcısı operatörü ile bir adres 'aralık' olarak - bu yüzden $!N(do Nadresi için dışında her yerde $gibi bir şey ile aynı sözdizimi gerçekten) m,n!d(hatlar hariç silme şeyi müzere n).
steeldriver

:benzeşir gotoetiket ve aslında :eskiden git insanların hem sed kullanarak günde arkaya tanıdık ve Thompson kabuk diye, Thompson kabukta etiket
Sergiy Kolodyazhnyy

0

Ben yaklaşık kargaşasına görmek beri bu cevap sonrası neden yürütürken son satırı hariç tutulur N(hat adresleme dize yoluyla $!) ve OP anlamını şaşırmıştı çünkü :a;$!N; içinde bir sed komutu , sadece içinde belirli one diye yayınlanmıştır .

$!NBunun yerine kullanmanın yararı, Nönerilen örneklerde (OP ve @terdon tarafından) belirgin değildir, çünkü komuttan sonraki son satırda "önemli" (okumaya devam et) komutu gerçekleştirilmez N. (Gerçekten de, bu satır adresi kesilirse sonuç aynıdır.)

Daha karmaşık bir örnekte (örneğin, this sentencebir dosyadaki ikame , bazen iki satır bazen bir satırda, diğer bazı zamanlar iki satırda görünür), Nkomutun son satırını hariç tutmak çok önemli olabilir! Son satır hariç tutulmazsa, üzerinde yürütüldükten Nsonra, hemen sedisabet eder EOFve çıkış yapar, sonraki tüm komutların (dallanma komutları, yani tve b) yürütülmesini önler .

Gösterilen çok basit örneklerde , iptal edilen komut yürütülürse hiçbir şey yapamayacağından, eşleşecek bir şey olmadığı için, yürütme ve geri dönüşte güvenle kaldırabilir $!ve sedbaşarısız olalım .Ns\n

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.