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 jen = split($0, fields, FS, separators)
kunnen schrijven waarfields
enseparators
arrays zijn.