web-dev-qa-db-fra.com

Utiliser sed avec ignore case tout en ajoutant du texte avant un motif

sed -i '/first/i This line to be added' 

Dans ce cas, comment ignorer la casse lors de la recherche de motif = premier

9
MaNn

Vous pouvez utiliser les éléments suivants:

sed 's/[Ff][Ii][Rr][Ss][Tt]/last/g' file

Sinon, vous avez les drapeaux /I et n/i:

sed 's/first/last/Ig' file

De l'homme sed :

I

i

Le modificateur I pour la correspondance d'expression régulière est une extension GNU qui permet à Sed d'apparier l'expression rationnelle d'une manière qui ne respecte pas la casse.

Tester

$ cat file
first
FiRst
FIRST
fir3st
$ sed 's/[Ff][Ii][Rr][Ss][Tt]/last/g' file
last
last
last
fir3st
$ sed 's/first/last/Ig' file
last
last
last
fir3st
25
fedorqui

GNU sed

sed '/first/Ii This line to be added' file
6
Endoro

si vous voulez enregistrer un peu de frappe, essayez awk. Je ne pense pas que Sed a cette option

 awk -v IGNORECASE="1" '/first/{your logic}' file
3
Kent

Tu peux essayer

sed 's/first/somethingelse/gI'
3
bendaizer

Pour les versions de awk qui ne comprennent pas la variable spéciale IGNORECASE, vous pouvez utiliser quelque chose comme ceci:

awk 'toupper($0) ~ /PATTERN/ { print "string to insert" } 1' file

Convertissez chaque ligne en majuscule avant de vérifier si elle correspond au modèle et, le cas échéant, imprimez la chaîne. 1 est le plus court true condition, donc awk utilise le comportement par défaut: { print }.

Pour utiliser une variable, vous pouvez aller avec ceci:

awk -v var="$foo" 'BEGIN { pattern = toupper(foo) } toupper($0) ~ pattern { print "string to insert" } 1' file

Cela transmet la variable Shell $foo et la transforme en majuscule avant le traitement du fichier.

Un peu plus court avec bash serait d'utiliser -v pattern="${foo^^}" et de sauter le bloc BEGIN.

1
Tom Fenech