Supposons un fichier texte multiligne file
dans lequel certaines lignes commencent par des espaces.Correspondance de mot clé insensible à la casse dans awk
$ cat file
foo Baz
baz QUX
QUx Quux
BaZ Qux
BazaaR
On suppose en outre que je souhaite convertir toutes ces lignes qui commencent par un mot-clé (par exemple « baz ») en lettres minuscules, quel que soit le cas (a) ce mot-clé est écrit en lettres minuscules ou en majuscules (ou toute combinaison de ceux-ci) et (b) ce mot-clé est précédé d'espaces.
$ cat file | sought_command
foo Baz # not to lowercase (line does not start with keyword)
baz qux # to lowercase
QUx Quux
baz qux # to lowercase
BazaaR # not to lowercase (line does not start with keyword, but merely with a word containing the keyword)
Je crois que awk est l'outil pour le faire, mais je ne suis pas certain comment mettre en œuvre l'insensibilité à la casse pour le ciblage des mots clés.
$ cat file | awk '{ if($1 ~ /^ *baz/) print tolower($0); else print $0}'
foo Baz
baz qux
QUx Quux
BaZ Qux # ERROR HERE: was not replaced, b/c keyword not recognized.
BazaaR
EDIT 1: Ajout IGNORECASE=1
semble résoudre le insensibilité à la casse, mais maintenant convertit de façon incorrecte la dernière ligne en minuscules.
$ cat file | awk '{IGNORECASE=1; if($1~/^ *baz/) print tolower($0); else print $0}'
foo Baz
baz qux
QUx Quux
baz qux
bazaar # ERROR HERE: should not be converted to lowercase, as keyword not present (emphasis on word!).
Je ne sais pas si awk supporte la correspondance insensible à la casse (comme le font d'autres dialectes regex). Mais cela devrait fonctionner: '/^* [bB] [aA] [zZ] /'. – Scheff