Yritän käyttää regexiä kentänerottimena ryhmässä awk
. Lukemastani tämä näyttää mahdolliselta, mutta En voi saada syntaksia oikein.
rpm -qa | awk "{ "FS == [0-9]" ; print $1 }" awk: cmd. line:1: { FS awk: cmd. line:1: ^ unexpected newline or end of string
Ajatuksia? Tavoitteena on saada luettelo ohjelmista ilman versionumeroa, ellei se ole huomaamaton.
Vastaa
Olet pilkkannut tarjouksesi ja syntaksisi. Syöttökentän erotin asetetaan helpoimmin tekemällä komentorivillä -F
-vaihtoehto:
awk -F "[0-9]" "{ print $1 }"
tai
awk -F "[[:digit:]]" "{ print $1 }"
Tämä käyttää mitä tahansa numeroa syöttökentän erottimena ja antaa sitten ensimmäisen kentän kustakin rivistä.
Lausekkeet [0-9]
ja [[:digit:]]
eivät ole aivan samanlaisia, riippuen kielestäsi. Katso ” Ero [0-9], [[: digit:]] ja \ d ”.
Voidaan myös asettaa FS
itse awk
-ohjelmassa. Tämä tehdään yleensä BEGIN
-lohkossa, kun se alustetaan kerran:
awk "BEGIN { FS = "[0-9]" } { print $1 }"
Huomaa, että yksi lainausmerkkejä ei voi käyttää kuoren yhden lainauksen merkkijonossa, ja että awk
merkkijonot käyttävät aina lainausmerkkejä.
Kommentit
- Onko mahdollista käyttää FS: ää ja nähdä merkitsevä merkkijono?
Vastaa
+1 Kusalanandan vastaukselle. Vaihtoehtoisesti FS-muuttuja voidaan asettaa BEGIN-lauseessa:
awk "BEGIN {FS="[0-9]"} {print $1}"
Toimintalohkon FS: n muuttaminen ei tule voimaan, ennen kuin seuraava rivi luetaan.
$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk "{FS="[0-9]"; print $1}" abc123 ghi
Muut kysymyksessä olevat virheet:
- ei voi käyttää yksittäisiä lainausmerkkejä yhden lainauksen merkkijonossa
-
==
on vertailuoperaattori,=
on tarkoitettu muuttujan määritykseen
Kommentit
- " Changi ng FS toimintalohkossa ' ei tule voimaan, kunnes seuraava rivi luetaan " I ' olen etsinyt tietoja kaikkialta.
- plus: ei voi ' t käyttää yksittäisiä lainausmerkkejä merkkijonon arvolle awk-muodossa, vaikka välität ne shell oikein
- Onko mahdollista käyttää FS: ää ja nähdä merkitsevä merkkijono?
-
FS
on muuttuja, joten voit tehdä mitä tahansa mikä tahansa muu muuttuja (esim.print FS
). Uskon, ettet voi saada osia, jotka sopivat FS: ään POSIX awk: n kanssa. GNU awk: lla voit kirjoittaan = split($0, fields, FS, separators)
, jossafields
jaseparators
ovat taulukoita.