Jessaie dutiliser regex comme séparateur de champ dans awk
. Daprès ma lecture, cela semble possible mais Je ne peux pas obtenir la bonne syntaxe.
rpm -qa | awk "{ "FS == [0-9]" ; print $1 }" awk: cmd. line:1: { FS awk: cmd. line:1: ^ unexpected newline or end of string
Pensées? Le but sinon évident est dobtenir une liste de logiciels sans numéro de version.
Réponse
Vous avez foiré vos citations et votre syntaxe. Pour définir le séparateur de champ de saisie, le moyen le plus simple de le faire est dutiliser loption -F
sur la ligne de commande:
awk -F "[0-9]" "{ print $1 }"
ou
awk -F "[[:digit:]]" "{ print $1 }"
Cela utiliserait nimporte quel chiffre comme séparateur de champ dentrée, puis afficherait le premier champ de chaque ligne.
Les expressions [0-9]
et [[:digit:]]
ne sont pas tout à fait les mêmes, selon vos paramètres régionaux. Voir « Différence entre [0-9], [[: digit:]] et \ d « .
On pourrait également définir FS
dans le programme awk
lui-même. Cela se fait généralement dans un bloc BEGIN
car il « sagit dune initialisation unique:
awk "BEGIN { FS = "[0-9]" } { print $1 }"
Notez ce single les guillemets ne peuvent « t être utilisés dans une chaîne entre guillemets simples dans le shell, et les awk
chaînes toujours utilisent des guillemets doubles.
Commentaires
- Est-il possible daccéder au FS et de voir la chaîne à laquelle il correspond?
Réponse
+1 pour la réponse de Kusalananda « . Alternativement, la variable FS peut être définie dans le bloc BEGIN:
awk "BEGIN {FS="[0-9]"} {print $1}"
La modification de FS dans un bloc daction ne prendra effet quà la lecture de la ligne suivante.
$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk "{FS="[0-9]"; print $1}" abc123 ghi
Les autres erreurs de la question:
- ne peut pas utiliser de guillemets simples dans une chaîne entre guillemets simples
-
==
est un opérateur de comparaison,=
est pour lattribution de variables
Commentaires
- " Changi ng FS dans un bloc daction gagné ' t prend effet jusquà ce que la ligne suivante soit lue " I ' a cherché partout cette information.
- plus: ' peut-il utiliser des guillemets simples pour la valeur de chaîne dans awk, même si vous les passez de shell correctement
- Est-il possible daccéder au FS et de voir la chaîne à laquelle il correspond?
-
FS
est une variable donc vous faites quelque chose comme toute autre variable (par exempleprint FS
). Pour obtenir les parties qui correspondent à FS, avec POSIX awk, je pense que vous ne pouvez pas. Avec GNU awk, vous pouvez écriren = split($0, fields, FS, separators)
oùfields
etseparators
sont des tableaux.