Hvordan bruges regex som feltseparator i awk?

Jeg prøver at bruge regex som markseparator i awk. Fra min læsning synes dette muligt, men Jeg kan ikke få syntaksen rigtig.

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

Tanker? Målet, hvis ikke obviouse, er at få en liste over software uden versionsnummer.

Svar

Du har dræbt dine citater og syntaks. For at indstille inputfeltadskilleren er den nemmeste måde at gøre det med -F på kommandolinjen:

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

eller

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

Dette vil bruge ethvert ciffer som inputfeltadskiller og derefter sende det første felt fra hver linje.

[0-9] og [[:digit:]] udtryk er ikke helt de samme, afhængigt af dit land. Se “ Forskel mellem [0-9], [[: digit:]] og \ d “.

Man kunne også indstille FS i selve awk -programmet. Dette gøres normalt i en BEGIN -blok, da den “er en engangsinitialisering:

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

Bemærk den enkelte citater kan “ikke bruges i en enkelt citeret streng i skallen, og at awk strenge altid bruger dobbelt anførselstegn.

Kommentarer

  • Er det muligt at få adgang til FS og se den streng, den matchede?

Svar

+1 for Kusalanandas svar. Alternativt kan FS-variablen indstilles i BEGIN-blokken:

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

Ændring af FS i en handlingsblok vil ikke træde i kraft, indtil næste linje læses

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

De andre fejl i spørgsmålet:

  • kan ikke bruge enkelt anførselstegn inde i en enkelt citeret streng
  • == er en sammenligningsoperator, = er til variabel tildeling

Kommentarer

  • " Changi ng FS i en handlingsblok vandt ' t træder i kraft, indtil den næste linje læses " I ' har været på udkig overalt for disse oplysninger.
  • plus: kan ' ikke bruge enkelt anførselstegn for strengværdi i awk, selvom du sender dem fra shell korrekt
  • Er det muligt at få adgang til FS og se den streng, den matchede?
  • FS er en variabel, så du gør hvad som helst enhver anden variabel (f.eks. print FS). For at få de dele, der matcher FS, med POSIX awk, tror jeg, du ikke kan. Med GNU awk kan du skrive n = split($0, fields, FS, separators) hvor fields og separators er arrays.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *