J'ai un script bash pour substituer des valeurs numériques à l'intérieur d'un modèle de texte. Supposons que j'ai un fichier comme celui-ci :
word5word
word55word
Et je veux qu'il ressemble à ceci :
word125word
word125word
J'ai ce script pour faire ça :
#!/bin/bash
re='([0-9]|[0-9][0-9])'
while read line
do
new_line=${line/"word"$re"word"/"word"125"word"}
echo "$new_line"
done < /home/tomak/test.txt
Pour une raison quelconque, l'expression 're' n'est pas interprétée correctement et imprime les lignes d'origine. Je ne peux tout simplement pas comprendre pourquoi. Cela fonctionne pour un seul chiffre, c'est-à-dire re='[0-9]'
.
Pour formuler l'expression, j'ai utilisé les informations du Bash Guide for Beginners qui stipule que :
Deux expressions régulières peuvent être jointes par l'opérateur infixe "|" ; l'
expression régulière résultante correspond à n'importe quelle chaîne correspondant à l'une des
sous-expressions.
Mais cela ne fonctionne tout simplement pas pour moi. Qu'est-ce que je rate ?
Notez que j'ai essayé de définir shopt -s extglob
et formulez l'expression comme [0-9][0-9]?
mais cela n'a pas fonctionné non plus.
Je suis sur Ubuntu 14.10 et j'ai la version stock bash 4.3.30. Je lance le script avec bash foo.sh
.
Réponse acceptée :
La substitution de l'expansion des paramètres ne fonctionne pas avec les expressions régulières. extglob
peut vous aider ici, mais cela ne fonctionne pas non plus avec les expressions régulières.
La syntaxe correcte pour l'expression sous extglob
est
re='+([0-9])'
c'est-à-dire un chiffre une ou plusieurs fois.
Test :
re='+([0-9])'
echo $'word5word\nword55word' | while read line ; do
new_line=${line/"word"$re"word"/"word"125"word"}
echo "$new_line"
done
Sortie :
word125word
word125word