Yalnızca belirli bir dizeyi içeren satırları nasıl ayarlayabilirim?


13

GİRİŞ:

Select ASDF 325 sdfg sdflk lk
Select TRG 46sdg rasdftz fsgs 45
Select ASDF 6ffg sdfg 4456 sdrg

ÇIKTI:

Select ASDF 325 XXXX sdflk lk
Select TRG 46sdg rasdftz fsgs 45
Select ASDF 6ffg XXXX 4456 sdrg

Yani kısaca "sed" "sdfg" için "XXXX" gerekir.

AMA: sadece "ASDF Seç" dizesini içeren satırlarda .. Bunu nasıl yapabilirim? (sed, awk vb.: \)

Yanıtlar:


19

Uygulandıkları satırları sınırlamak için çoğu sed komutunun önüne bir adres ekleyebilirsiniz. Bir adres bir satır numarası veya tarafından sınırlandırılmış bir normal ifade olabilir /.

cat INPUT | sed '/Select ASDF/ s=sdfg=XXXX='

Peter.O'dan bahsedildiği gibi, yukarıda yazılan komut, sdfgiçeren dizedeki herhangi bir ilk oluşumun yerini alacaktır Select ASDF. Tam eşleşmeyi sdfgyalnızca dördüncü sütunda olması durumunda değiştirmeniz gerekiyorsa, şu şekilde gitmelisiniz:

cat INPUT | sed 's/\(^Select ASDF [^ ]* \)sdfg /\1XXXX /'

1
Sdfg içeren başka bir alan ne olacak ? Örneğin. 5sdfga
Peter.O

Hmm, aslında sorun da bu değil. Cevabımı güncelledim.
acele

Kullanmak için herhangi bir seçenek var: sed '/ Select ASDF / gs = sdfg = XXXX =' - bu yüzden sadece ilkini değil, bir satırdaki tüm oluşumları değiştirmem gerekiyor. ama sed "g" kullanırsam hata veriyor
LanceBaynes

1
Sondan gsonra =( skomutun sonunda ) yazmanız gerekir . : Böyle olacaksed '/Select ASDF/ s=sdfg=XXXX=g'
acele

7

Sütun 4'ü yalnızca tam değere sahipse değiştiriyorsanız, normal ifadeler yerine eşitlik işleçlerini kullanmak mantıklıdır.

awk '$1 == "Select" && $2 == "ASDF" && $4 == "sdfg" {$4 = "XXXX"} {print}'

1
Hızlı! .. 1 milyon satır için Birei'nin awk ve Rush'ın konumsal sed ile karşılaştırılması: 0m1.580s vs. 0m3.792s vs. 0m6.740s
Peter.O

1

Kullanma GNU awk:

awk '
    BEGIN { IGNORECASE = 1 } 
    /^select asdf/ { 
        sub( /\<sdfg\>/, "XXXX", $0 ) 
    } 
    { print }
' infile

Çıktı:

Select ASDF 325 XXXX sdflk lk
Select TRG 46sdg rasdftz fsgs 45
Select ASDF 6ffg XXXX 4456 sdrg

GÜNCELLEME : IGNORECASEGNU olmayan bir awkdurumdan kaçının ve büyük / küçük harfe duyarlı. Bu ayrıntıya dikkat çeken jw013 sayesinde :

awk ' 
    /^Select ASDF/ { 
        sub( /\<sdfg\>/, "XXXX", $0 ) 
    } 
    { print }
' infile

1
IGNORECASEBir GNU awk/ gawkuzantısı olduğunu belirtmelisiniz .
jw013

1
@ jw013: Teşekkür ederim. Yanıtınız önerinizle güncellendi.
Birei

4
IGNORECASE, bu durumda, GNU veya G'not olsun, yanlıştır. Sorudaki kriter açıkça büyük harfASDF
Peter.O için
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.