Normal ifade awk içinde alan ayırıcı olarak nasıl kullanılır?


16

Regex bir alan ayırıcı olarak kullanmaya çalışıyorum awk. Okuduğumda bu mümkün görünüyor, ancak sözdizimini doğru anlayamıyorum.

rpm -qa | awk '{ 'FS == [0-9]' ; print $1 }'
awk: cmd. line:1: { FS
awk: cmd. line:1:     ^ unexpected newline or end of string

Düşünceler? Uğraşmasa amaç, sürüm numarası olmayan bir yazılım listesi elde etmektir.

Yanıtlar:


25

Tırnaklarınızı ve sözdiziminizi karıştırdınız. Giriş alanı ayırıcısını ayarlamak için, bunu yapmanın en kolay yolu -Fkomut satırındaki seçenektir:

awk -F '[0-9]' '{ print $1 }'

veya

awk -F '[[:digit:]]' '{ print $1 }'

Bu, giriş alanı ayırıcısı olarak herhangi bir rakam kullanır ve her satırdan ilk alanı çıkarır.

[0-9]Ve [[:digit:]]ifadeler değildir oldukça Bulunduğunuz yerin bağlı olarak aynı. Bkz. " [0-9], [[: basamak:]] ve \ d arasındaki fark ".

Bir de ayarlayabilirsiniz FSiçinde awkprogramın kendisi. Bu genellikle BEGINbir kerelik başlatma olduğundan bir blokta yapılır :

awk 'BEGIN { FS = "[0-9]" } { print $1 }'

Tek tırnakların kabuktaki tek tırnaklı bir dizede kullanılamayacağını ve awkdizelerin her zaman çift ​​tırnak kullandığını unutmayın.


12

Kusalananda'nın cevabı için +1. Alternatif olarak, FS değişkeni BEGIN bloğunda ayarlanabilir:

awk 'BEGIN {FS="[0-9]"} {print $1}'

Bir eylem bloğundaki FS'nin değiştirilmesi sonraki satır okunana kadar etkili olmaz

$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk '{FS="[0-9]"; print $1}'
abc123
ghi

Sorudaki diğer hatalar:

  • tek tırnaklı bir dize içinde tek tırnak kullanamazsınız
  • ==bir karşılaştırma operatörüdür, =değişken atama içindir

1
"Bir eylem bloğunda FS'nin değiştirilmesi bir sonraki satır okunana kadar etkili olmayacak." Bu bilgiyi her yerde arıyordum.
Samizdis

1
artı: doğru şekilde kabuktan
geçirseniz
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.