İki desen arasındaki (ve hariç) satırları yazdırma


13

İçeriğin bir kısmının başka bir dosyadan geldiği cURL kullanarak form göndereceğim. sed

Eğer param1kullanan diğer dosyadan satır eşleştirme kalıptır sedirade cezası çalışır komuta altında,:

curl -d param1="$(sed -n '/matchpattern/p' file.txt)" -d param2=value2 http://example.com/submit

Şimdi, soruna gidin. Ben sadece eşleşen desen hariç 2 eşleşen desen arasındaki metni göstermek istiyorum.

Diyelim ki şunları file.txtiçeriyor:

Bla bla bla
firstmatch
It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
secondmatch
The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English.

Şu anda, çok sayıda "beetween 2 eşleşen desen" sedkomutu firstmatchve secondmatch.

Sonucun olmasını istiyorum:

It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.

Yanıtlar:


15

İşte bunu yapmanın bir yolu:

sed '1,/firstmatch/d;/secondmatch/,$d' 

Açıklandı: İlk satırdan eşleşen ilk eşleşmeye kadar silin. Hat eşleştirme itibaren secondmatch son çizgiye, silin.



6

1. satır 1'de gerçekleşirse diğer sedçözüm başarısız olur . firstmatch

Basit tutun, tek bir aralık ve boş bir 2 normal ifade kullanın:
aralık aralıkları hariç bu aralıktaki her şeyi yazdırın (otomatik yazdırma devre dışı) 3 :

sed -n '/firstmatch/,/secondmatch/{//!p;}' infile

veya daha kısa, o aralıkta olmayan her şeyi silin ve ayrıca aralık uçlarını silin:

sed '/firstmatch/,/secondmatch/!d;//d' infile


1: İkinci adres bir normal ifade ise, bitiş eşleşmesini kontrol etmek, ilk adresle eşleşen satırı izleyen satırla başlayacaktır .
Bu nedenle, /firstmatch/girişin ilk satırı için asla değerlendirilmez sed, satır numarasıyla eşleştiği için onu siler 1,/RE/ve satırın eşleşip eşleşmediğini kontrol ettiği 2. satıra geçer./firstpattern/

2: Bir REGEX boş olduğunda (yani //) sed, uygulanan son komutta kullanılan en son REGEX (adres olarak veya yedek komutun bir parçası olarak) belirtilmiş gibi davranır .

3: ;}sözdizimi modern seduygulamalar içindir; büyük olanlar noktalı virgül yerine yeni satır veya ayrı ifadeler kullanır.sed -n -e '/firstmatch/,/secondmatch/{//!p' -e '}' infile


Ne //yaptığını açıklayabilir misiniz {…}?
G-Man 'Monica'yı Yeniden

Teşekkürler, ama tuzağımın içine düştün. Bunun //kullanılan son düzenli ifade anlamına geldiğini biliyorum ; okuduğum her şeyden, öyle olmalı /secondmatch/. Komutunuzun çalıştığını test ederek doğruladım ve bu yüzden /firstmatch|secondmatch/(onayladığınız) olarak çalıştığı sonucuna vardım , ancak herhangi bir belge bulamıyorum ( bağlandığınız POSIX belgesi veya GNU bile değil) sed manual ) ile ilişkili olan kısmını dışarı aktarmak suretiyle yedek oluşturmanız gerekir: … (Devam ediyor)
G-Man,

(Devamı)… Eğlenceli deneyler: (I) In sed: (1) Eğer yaparsam /first/,4, o zaman //böyle davranır /first/. (2) Bunu yaparsam 2,/second/, //“önceki düzenli ifade yok” hatası alır. (Bunu belirtilen davranışı izlemede açık bir başarısızlık olarak görüyorum.) (3) Ekleme --posixyukarıdakilerin hiçbirini değiştirmez. (II) Diğer programlarda: (4) viSonra /first/,/second/, sonra //gibi davranır /second/(ve diğer formlar da belgelenmiş kuralın rasyonel uygulamalarıdır). … (Devam ediyor)
G-Man,

(Devam)… (5)  awk“kullanılan son RE” hakkında hiçbir fikre sahip görünmemektedir; //herhangi bir karakterden önce veya sonra karakter olmayan karakter anlamına gelir. (Sizi denemeye davet ediyorum echo -- | awk '{ gsub(//, "cha"); print }'.)
G-Man, '

Böylece, “son komutta kullanılan son REGEX” i “son komutta kullanılan son REGEX (ler)” olarak okudunuz ve böylece (doğru) anlamına geldiğini tahmin ettiniz /first|second/. Seni şanslı. Bunun sistem çapında bir normal regex sözleşmesi olmadığını göstermek için diğer programlardan bahsediyorum. Kim eklese onu sedeklemek zahmet etmedi, nerdeyse vimmantıklı olurdu. :-) ⁠
G-Man 'eski durumuna Monica' Diyor
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.