2 farklı hat için grep nasıl kullanılır


15

Tek bir grepkomut kullanarak iki farklı satırda olduklarında iki farklı ifadeyi nasıl arayabilirim ?

Örneğin

Satır 1: Bu bir tatlı.

Satır 2: limon.

Bunu kullandım ama sonuç yok

grep "sweet.*lemon" file_type

Yanıtlar:


20

grepİki farklı çizgi kullanmak için her iki deseni de arayın

$ grep -e sweet -e lemon file_type
This is a sweet
lemon.

Veya alternatif kullanın

$ grep -E 'sweet|lemon' file_type
This is a sweet
lemon.

Bir kalıptan sonraki satırı almak için bağlam seçeneğini kullanabilirsiniz

$ grep -A1 sweet file_type
This is a sweet
lemon.

Ama bir çok satırlı desen için açıkça arama yapıyorsanız zor çünkü var grephatlarında sanıyor ... . Sizin .*"tatlı" ve "limon" arasındaki irade yakalamak her şey hattında . Sonraki satıra yeni satırla eşleştirmek için -Pkullanarak "limon" alabiliriz ve dosyanın boş \nbırakıldığını söyleyerek :grep-z

$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.

Notlar:

  • -EGenişletilmiş düzenli ifadeler kullanın ( |karakterden kaçmak zorunda kalmadan değişimli olarak kullanmak için)
  • -An Desenden sonra ek satırlar yazdırın; burada n, yazdırılacak olan arka satır sayısıdır
  • -PPerl tarzı düzenli ifadeler kullanın ( daha iyi perl regex desteği için yerine "deneysel" in grep- install pcregrep)
  • -zAyırıcı olarak null karakteri kullanın (sadece bu durumda davranarak, ama grepbunun için bizim sözümüze olacak)
  • -o sadece eşleşen kısmı yazdır

İken grep -zPkomutu (bir maç orada bir yerde ise) o genel so ya bütün dosya içeriğini dökümü, tek bir çizgi olarak herhangi sıradan yeni satır ayrılmış bir dosyayı ele alacak (bir dosya tam olarak iki satırdan oluşan) bu özel durumda çalışacak veya hiçbirşey; genellikle insanların kullandığı şey bu değildir grep.
Marc van Leeuwen

evet bu sadece -o... ile düzenlenmiştir ...
Zanna

Bunun diğer dağıtımlarda denenmesi durumunda, aşağıdakilerle karşılaşabilirsiniz: grep: The -P and -z options cannot be combined- örn.
RHEL'de

6

Bunun gibi:

grep "sweet\|lemon"

üzgünüm ama bu tam olarak "tatlı | limon" ile
eşleşecek

4
@KasiyA Bu hat iyi çalışıyor. grep"özel karakterler" gibi "standart modda" varsayılan eserleri ile |, +, *kelimenin tam anlamıyla yorumlanır sürece onlar ters eğik çizgi maskeli ediyoruz. Örneğin bu cevaba bakınız . Muhtemelen alıştığınız şekilde kullanmak için, "özel karakterlerin" tam anlamıyla yorumlanması için maskelenmesi gerekir, "genişletilmiş moda" ( grep -E) geçmeniz gerekir . Belki madneon örneğin neyi OP deneyin onun yanıtlara biraz daha ayrıntılı olabilir olurdu eşleştirdiniz?
Henning Kockerbeck
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.