GNU/Linux >> Tutoriels Linux >  >> Ubuntu

Bash :Expressions régulières en substitution ?

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

Ubuntu
  1. Expressions régulières :tout rassembler

  2. Utilisation de modificateurs de mots avec l'historique Bash sous Linux

  3. Citation dans $(substitution de commande) dans Bash ?

  4. Bash + Vérifier le nom par expression régulière ?

  5. 6 Exemples d'expressions conditionnelles Bash ( -e, -eq, -z, !=, [, [[ ..)

Initiation aux expressions régulières

Expression de séquence bash (plage)

Expressions régulières dans Grep (Regex)

Pourquoi `\d` ne fonctionne-t-il pas dans les expressions régulières de sed ?

Renommeur de fichiers d'expressions régulières de l'interface graphique Linux (avec substitution)

Expression régulière avec sed