Pokouším se použít regex jako oddělovač polí v awk
. Z mého čtení se to zdá možné, ale Nemohu správně pochopit syntaxi.
rpm -qa | awk "{ "FS == [0-9]" ; print $1 }" awk: cmd. line:1: { FS awk: cmd. line:1: ^ unexpected newline or end of string
Myšlenky? Pokud to není zřejmé, je cílem získat seznam softwaru bez čísla verze.
Odpovědět
Složili jste své nabídky a syntaxi. Nejjednodušší způsob, jak nastavit oddělovač vstupního pole, je možnost -F
na příkazovém řádku:
awk -F "[0-9]" "{ print $1 }"
nebo
awk -F "[[:digit:]]" "{ print $1 }"
Jako oddělovač vstupního pole by se použila jakákoli číslice a z každého řádku by se vygenerovalo první pole.
Výrazy [0-9]
a [[:digit:]]
nejsou zcela stejné, v závislosti na vašem národním prostředí. Viz „ Rozdíl mezi [0-9], [[: digit:]] a \ d „.
Lze také nastavit FS
v samotném programu awk
. To se obvykle provádí v BEGIN
bloku, protože se jedná o jednorázovou inicializaci:
awk "BEGIN { FS = "[0-9]" } { print $1 }"
Všimněte si, že jeden uvozovky nelze použít v řetězci s jednou uvozovkou v shellu a awk
řetězce vždy používají uvozovky.
Komentáře
- Je možné získat přístup k FS a zobrazit řetězec, který odpovídá?
Odpovědět
+1 pro odpověď Kusalanandy. Alternativně lze proměnnou FS nastavit v BEGIN bloku:
awk "BEGIN {FS="[0-9]"} {print $1}"
Změna FS v akčním bloku se projeví až po přečtení dalšího řádku.
$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk "{FS="[0-9]"; print $1}" abc123 ghi
Další chyby v otázce:
- nelze použít uvozovky uvnitř řetězce s jednou uvozovkou,
-
==
je operátor porovnání,=
je pro přiřazení proměnných
Komentáře
- " Changi ng FS v akčním bloku se ' projeví až do přečtení dalšího řádku " I ' tyto informace hledal všude.
- plus: nemůže ' t použít jednoduché uvozovky pro hodnotu řetězce v awk, i když je předáte z správně shell
- Je možné získat přístup k FS a zobrazit řetězec, který se shoduje?
-
FS
je proměnná, takže můžete dělat cokoli jako jakákoli jiná proměnná (např.print FS
). Chcete-li získat součásti, které odpovídají FS, s POSIX awk, myslím, že nemůžete. S GNU awk můžete psátn = split($0, fields, FS, separators)
kdefields
aseparators
jsou pole.