Awk'de büyük / küçük harfe duyarlı olmayan arama


20

Ben awk kullanarak bir anahtar kelime aramak gerekir, ancak büyük / küçük harf duyarsız (büyük / küçük harfe duyarlı olmayan) bir arama yapmak istiyorum.

Bence en iyi yaklaşım hem arama terimini ("anahtar kelime") hem de awk'ın aynı anda okuduğu hedef çizgiyi büyük harfle yazmaktır. Gönderen bu soruya nasıl kullanmak touppertümü büyük harf yazdırmak için, ama bu cevap sadece gösterileri baskı ve bir değişkene büyük metin bırakmaz çünkü maçında nasıl kullanılacağını bilmiyorum.

Bu girdi göz önüne alındığında bir örnek:

blablabla    
&&&Key Word&&&
I want all 
these text and numbers 123
and chars !"£$%&
as output
&&&KEY WORD&&&
blablabla

Bu çıktıyı istiyorum:

I want all 
these text and numbers 123
and chars !"£$%&
as output

Sahip olduğum şey bu, ama nasıl ekleyeceğimi bilmiyorum toupper:

awk "BEGIN {p=0}; /&&&key word&&&/ { p = ! p ; next } ; p { print }" text.txt

Yanıtlar:


23

Bir kalıbı (ör. /&&&key word&&&/) $0Geçerli satırı açıkça kullanan başka bir ifadeyle eşleştirmek için ifadenizi değiştirin :

tolower($0) ~ /&&&key word&&&/

veya

toupper($0) ~ /&&&KEY WORD&&&/

yani sahipsin

awk 'tolower($0) ~ /&&&key word&&&/ { p = ! p ; next }; p' text.txt

$0BEGIN bloğu, değişkenler varsayılan olarak ilk kullanımda ""veya 0ilk kullanımda başlatıldığından ve {print}aşağıdaki yorumlarda belirtildiği gibi varsayılan eylem olduğu için tek tırnak işareti kullanmanız gerekir .


4
Bunu basitleştirebileceğinizi unutmayın awk 'toupper($0)~/&&&KEY WORD&&&/ { p = ! p ; next } ; p;' text.txt. Bloğa gerek yoktur BEGINve varsayılan eylem yazdırmak olduğundan p;, yeterlidir.
terdon

1
BEGINBaşlatılmamış bir değişken yanlış olarak değerlendirildiğinden "bloğa gerek yoktur ".
glenn jackman

İyileştirmeler için teşekkürler. Genellikle cevabımı orijinaldeki minimum değişikliklerle sınırlamaya çalışırım, ancak yeni sonucun daha sıkı ve oldukça okunabilir olduğu doğrudur.
meuh

2
Sadece bir not: tolowereski (ya da çok eski olmayan) awk sürümleri (örn: AIX) sistemlerinde bulunur, ancak toupperher zaman mevcut değildir ^^.
Olivier Dulac

16

gawk, IGNORECASEsıfır olmayan bir değere ayarlanırsa, tüm dize ve normal ifade karşılaştırmalarının büyük / küçük harfe duyarlı olmamasına neden olan bir yerleşik değişkeni vardır . Bunu kullanabilirsiniz:

BEGIN{IGNORECASE=1}
/&&&key word&&&/ { foo bar baz }

gawkAncak bu özeldir , ancak meuh'un (daha taşınabilir) alternatifinden daha okunabilir olduğunu düşünüyorum. Bunun bir sorun olup olmadığı elbette tamamen size kalmış.


1
En büyük gawk projelerimden birinde yıllarca awk'yi desteklemek istedim, ancak gawk'ın durum duyarsız arama tetikleyicilerinin olmaması, işlerin çalıştığı durum duyarsız aramaların sayısı nedeniyle bunu bir başlangıç ​​yapmadı. gensub, awk ile değiştirilmesi çok zor olan diğer gawk özelliğidir. Ancak gawk, bazı makinelere ve dağıtımlara her zaman varsayılan olarak yüklenmez, ancak neredeyse her zaman kullanılabilir, ancak 2016'ya kadar bu tür standart araçların işlevselliğini biraz genişletmek için awk ve posix'i değiştiremedikleri talihsiz bir durumdur.
Lizardx

3
@Lizardx: genişlememenin asıl mesele bu: standart tutmak. Aksi takdirde, sadece başka bir standart yaratırsınız ve sonra aralarında bazı eksiklikler vardır (bunu yaparlar, ancak standart değişiklikleri minimumda tutmaya çalışırlar ... o zaman bile, çoklu standart bilişimin ana vebalarından biridir)
Olivier Dulac

2
Kabul etmiyorum. Dikkatli yürütme ile, tüm eski yöntemleri desteklerken genişletmeler getirebilirsiniz, bunu yapmazsanız ne olur, zamanla ilgisizliğe kaybolmaya başlar. Hesaplamadaki her şey gelişir, hile çok istikrarlı bir güvenilir evrim sağlamaktır. Bash bunu yapmanın iyi bir örneğidir, süper güvenilirdir ve sadece yeni özellikler ekler, desteklenenleri kullanmak kadar 'iki standart' değildir ve değişiklikler küresel olarak kullanıma sunulduktan sonra yeni özellikleri kullanmaya başlayabilirsiniz, çünkü yalnızca en eski eski sistemlerin desteği olmayacak.
Lizardx
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.