Hoe regex als veldscheidingsteken in awk te gebruiken?

Ik “probeer regex te gebruiken als een veldscheidingsteken in awk. Uit mijn lezing lijkt dit mogelijk, maar Ik kan de syntaxis niet goed krijgen.

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

Gedachten? Het doel, zo niet vanzelfsprekend, is om een lijst met software zonder versienummer te krijgen.

Antwoord

Je hebt je aanhalingstekens en syntaxis door elkaar gehaald. Om het scheidingsteken voor het invoerveld in te stellen, is de gemakkelijkste manier om dit te doen met de -F optie op de opdrachtregel:

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

of

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

Dit zou elk cijfer gebruiken als scheidingsteken voor het invoerveld, en dan het eerste veld van elke regel uitvoeren.

De [0-9] en [[:digit:]] uitdrukkingen zijn niet helemaal hetzelfde, afhankelijk van uw landinstelling. Zie “ Verschil tussen [0-9], [[: digit:]] en \ d “.

Men zou ook FS in het awk programma zelf. Dit wordt meestal gedaan in een BEGIN blok aangezien het “een eenmalige initialisatie is:

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

Merk op dat enkele aanhalingstekens kunnen “niet worden gebruikt in een string met enkele aanhalingstekens in de shell, en die awk strings altijd gebruiken dubbele aanhalingstekens.

Opmerkingen

  • Is het mogelijk om toegang te krijgen tot de FS en de string te zien waarmee deze overeenkomt?

Antwoord

+1 voor het antwoord van Kusalananda. Als alternatief kan de FS-variabele worden ingesteld in het BEGIN-blok:

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

Het wijzigen van FS in een actieblok wordt pas van kracht als de volgende regel is gelezen

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

De andere fouten in de vraag:

  • kan “geen enkele aanhalingstekens gebruiken binnen een tekenreeks met enkele aanhalingstekens.
  • == is een vergelijkingsoperator, = is voor het toewijzen van variabelen

Opmerkingen

  • " Changi ng FS in een actieblok heeft ' niet van kracht totdat de volgende regel is gelezen " I ' heb overal naar die informatie gezocht.
  • plus: kan ' geen enkele aanhalingstekens gebruiken voor stringwaarde in awk, zelfs als je ze doorgeeft van shell correct
  • Is het mogelijk om toegang te krijgen tot de FS en de string te zien waarmee het overeenkomt?
  • FS is een variabele, dus je doet zoiets als elke andere variabele (bijv. print FS). Om de onderdelen te krijgen die bij FS passen, met POSIX awk, denk ik dat je dat niet kunt. Met GNU awk zou je n = split($0, fields, FS, separators) kunnen schrijven waar fields en separators arrays zijn.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *