{"id":1234,"date":"2016-10-10T09:47:05","date_gmt":"2016-10-10T07:47:05","guid":{"rendered":"http:\/\/les-fougs.com\/info\/?p=1234"},"modified":"2017-09-04T08:59:18","modified_gmt":"2017-09-04T06:59:18","slug":"manipuler-les-chaines-de-caracteres","status":"publish","type":"post","link":"http:\/\/les-fougs.com\/wordpress\/2016\/10\/10\/manipuler-les-chaines-de-caracteres\/","title":{"rendered":"Manipuler les cha\u00eenes de caract\u00e8res"},"content":{"rendered":"<p>http:\/\/abs.traduc.org\/abs-5.3-fr\/ch09s02.html<\/p>\n<p>&nbsp;<\/p>\n<p>Bash supporte un nombre surprenant d&rsquo;op\u00e9rations de manipulation de cha\u00eenes de caract\u00e8res. Malheureusement, ces outils manquent d&rsquo;unit\u00e9. Certains sont un sous-ensemble de la\u00a0<a href=\"http:\/\/abs.traduc.org\/abs-5.3-fr\/ch09s03.html#paramsubref\">substitution de param\u00e8tre<\/a>\u00a0et les autres font partie des fonctionnalit\u00e9s de la commande UNIX\u00a0<a href=\"http:\/\/abs.traduc.org\/abs-5.3-fr\/ch15s02.html#exprref\">expr<\/a>. Ceci produit une syntaxe de commande non unifi\u00e9e et des fonctionnalit\u00e9s qui se recoupent, sans parler de la confusion engendr\u00e9e.<\/p>\n<div>\n<p><a id=\"stringlength\" name=\"stringlength\"><\/a><b>Longueur de cha\u00eenes de caract\u00e8res<\/b><\/p>\n<dl>\n<dt>${#chaine}<\/dt>\n<dt>expr length $chaine<\/dt>\n<dd><a id=\"strlen\" name=\"strlen\"><\/a>C&rsquo;est l&rsquo;\u00e9quivalent de la fonction\u00a0<em>strlen()<\/em>\u00a0en\u00a0<em>C<\/em>.<\/dd>\n<dt>expr &laquo;&nbsp;$chaine&nbsp;&raquo; : &lsquo;.*&rsquo;<\/dt>\n<dd>\n<pre>chaineZ=abcABC123ABCabc\r\n\r\necho ${#chaineZ}                 # 15\r\necho `expr length $chaineZ`      # 15\r\necho `expr \"$chaineZ\" : '.*'`    # 15<\/pre>\n<\/dd>\n<\/dl>\n<\/div>\n<div>\n<p><a id=\"paragraphspace\" name=\"paragraphspace\"><\/a><b>Exemple\u00a09.10.\u00a0Ins\u00e9rer une ligne blanche entre les paragraphes d&rsquo;un fichier texte<\/b><\/p>\n<div>\n<pre>#!\/bin\/bash\r\n# paragraph-space.sh\r\n\r\n# Ins\u00e8re une ligne blanche entre les paragraphes d'un fichier texte.\r\n# Usage: $0 &lt;NOMFICHIER\r\n\r\nLONGUEUR_MINI=45        # Il peut \u00eatre n\u00e9cessaire de changer cette valeur.\r\n#  Suppose que les lignes plus petites que $LONGUEUR_MINI caract\u00e8res\r\n#+ terminent un paragraphe.\r\n\r\nwhile read ligne  # Pour toutes les lignes du fichier...\r\ndo\r\n  echo \"$ligne\"   # Afficher la ligne.\r\n\r\n  longueur=${#ligne}\r\n  if [ \"$longueur\" -lt \"$LONGUEUR_MINI\" ]\r\n    then echo    # Ajoute une ligne blanche apr\u00e8s chaque petite ligne.\r\n  fi  \r\ndone\r\n\r\nexit 0<\/pre>\n<\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<div>\n<p><a id=\"lengthsubstring\" name=\"lengthsubstring\"><\/a><b>Longueur de sous-cha\u00eenes correspondant \u00e0 un motif au d\u00e9but d&rsquo;une cha\u00eene<\/b><\/p>\n<dl>\n<dt><a id=\"exprmatch\" name=\"exprmatch\"><\/a>expr match &laquo;&nbsp;$chaine&nbsp;&raquo; &lsquo;$souschaine&rsquo;<\/dt>\n<dd><em><tt>$souschaine<\/tt><\/em>\u00a0est une\u00a0<a href=\"http:\/\/abs.traduc.org\/abs-5.3-fr\/ch17.html#regexref\">expression rationnelle<\/a>.<\/dd>\n<dt>expr &laquo;&nbsp;$chaine&nbsp;&raquo; : &lsquo;$souschaine&rsquo;<\/dt>\n<dd><em><tt>$souschaine<\/tt><\/em>\u00a0est une expression rationnelle.<\/p>\n<pre>chaineZ=abcABC123ABCabc\r\n#       |------|\r\n\r\necho `expr match \"$chaineZ\" 'abc[A-Z]*.2'`   # 8\r\necho `expr \"$chaineZ\" : 'abc[A-Z]*.2'`       # 8<\/pre>\n<\/dd>\n<\/dl>\n<\/div>\n<div>\n<p><a id=\"substringindex\" name=\"substringindex\"><\/a><b>Index<\/b><\/p>\n<dl>\n<dt><a id=\"substringindex2\" name=\"substringindex2\"><\/a>expr index $chaine $souschaine<\/dt>\n<dd>Position num\u00e9rique dans $chaine du premier caract\u00e8re dans $souschaine qui correspond.<\/p>\n<pre>chaineZ=abcABC123ABCabc\r\necho `expr index \"$chaineZ\" C12`             # 6\r\n                                             # C position.\r\n\r\necho `expr index \"$chaineZ\" 1c`              # 3\r\n# 'c' (\u00e0 la position #3) correspond avant '1'.<\/pre>\n<p>Ceci est l&rsquo;\u00e9quivalent le plus proche de\u00a0<em>strchr()<\/em>\u00a0en\u00a0<strong>C<\/strong>.<\/dd>\n<\/dl>\n<\/div>\n<div>\n<p><a id=\"substringextraction\" name=\"substringextraction\"><\/a><b>Extraction d&rsquo;une sous-cha\u00eene<\/b><\/p>\n<dl>\n<dt><a id=\"substrextr01\" name=\"substrextr01\"><\/a>${chaine:position}<\/dt>\n<dd>Extrait une sous-cha\u00eene de\u00a0<em><tt>$chaine<\/tt><\/em>\u00a0\u00e0 partir de la position\u00a0<em><tt>$position<\/tt><\/em>.<\/p>\n<p>Si le param\u00e8tre\u00a0<tt>$chaine<\/tt>\u00a0est \u00ab\u00a0*\u00a0\u00bb ou \u00ab\u00a0@\u00a0\u00bb, alors cela extrait les\u00a0<a href=\"http:\/\/abs.traduc.org\/abs-5.3-fr\/ch09.html#posparamref\">param\u00e8tres de position<\/a>,\u00a0<sup>[<a id=\"id3716228\" href=\"http:\/\/abs.traduc.org\/abs-5.3-fr\/ch09s02.html#ftn.id3716228\" name=\"id3716228\">36<\/a>]<\/sup>\u00a0commen\u00e7ant \u00e0\u00a0<tt>$position<\/tt>.<\/dd>\n<dt><a id=\"substrextr02\" name=\"substrextr02\"><\/a>${chaine:position:longueur}<\/dt>\n<dd>Extrait\u00a0<em><tt>$longueur<\/tt><\/em>\u00a0caract\u00e8res d&rsquo;une sous-cha\u00eene de\u00a0<em><tt>$chaine<\/tt><\/em>\u00a0\u00e0 la position\u00a0<em><tt>$position<\/tt><\/em>.<\/p>\n<pre>chaineZ=abcABC123ABCabc\r\n#       0123456789.....\r\n#       indexage base 0.\r\n\r\necho ${chaineZ:0}                            # abcABC123ABCabc\r\necho ${chaineZ:1}                            # bcABC123ABCabc\r\necho ${chaineZ:7}                            # 23ABCabc\r\n\r\necho ${chaineZ:7:3}                          # 23A\r\n                                             # Trois caract\u00e8res de la sous-cha\u00eene.\r\n\r\n# Est-il possible d'indexer \u00e0 partir de la fin de la cha\u00eene ?\r\n\r\necho ${chaineZ:-4}                           # abcABC123ABCabc\r\n# Par d\u00e9faut la cha\u00eene compl\u00e8te, comme dans ${parametre:-default}.\r\n# N\u00e9anmoins...\r\n\r\necho ${chaineZ:(-4)}                         # Cabc\r\necho ${chaineZ: -4}                          # Cabc\r\n# Maintenant, cela fonctionne.\r\n#  Des parenth\u00e8ses ou des espaces ajout\u00e9s permettent un \u00e9chappement du param\u00e8tre\r\n#+ de position.\r\n\r\n# Merci, Dan Jacobson, pour cette indication.<\/pre>\n<p>Les arguments\u00a0<em>position<\/em>\u00a0et\u00a0<em>longueur<\/em>\u00a0peuvent devenir des \u00ab\u00a0param\u00e8tres\u00a0\u00bb, c&rsquo;est-\u00e0-dire repr\u00e9sent\u00e9s par une variable, plut\u00f4t que par une constante num\u00e9rique.<\/p>\n<p><a id=\"randstring0\" name=\"randstring0\"><\/a><\/p>\n<div>\n<p><a id=\"randstring\" name=\"randstring\"><\/a><b>Exemple\u00a09.11.\u00a0G\u00e9n\u00e9rer \u00ab\u00a0al\u00e9atoirement\u00a0\u00bb une cha\u00eene de huit caract\u00e8res<\/b><\/p>\n<div>\n<pre>#!\/bin\/bash\r\n# rand-string.sh\r\n# G\u00e9n\u00e9rer al\u00e9atoirement une cha\u00eene de huit caract\u00e8res.\r\n\r\nif [ \"-n $1\" ]  #  Si pr\u00e9sence d'un argument en ligne de commande,\r\nthen            #+ alors l'utiliser comme cha\u00eene de d\u00e9part.\r\n  chaine0=\"$1\"\r\nelse            #  Sinon, utiliser le PID du script.\r\n  chaine0=\"$$\"\r\nfi\r\n\r\nPOS=2  # On commence en position 2.\r\nLONG=8  # Extraction de huit caract\u00e8res.\r\n\r\nchaine1=$( echo \"$chaine0\" | md5sum | md5sum )\r\n# Double mixage :            ^^^^^^   ^^^^^^\r\n\r\nchainealeatoire=\"${chaine1:$POS:$LONG}\"\r\n# Peut se param\u00e9trer       ^^^^ ^^^^^\r\n\r\necho \"$chainealeatoire\"\r\n\r\nexit $?\r\n\r\n# bozo$ .\/rand-string.sh mon-motdepasse\r\n# 1bdd88c4\r\n\r\n#  Non, ceci n'est pas recommand\u00e9\r\n#+ comme m\u00e9thode s\u00fbre de g\u00e9n\u00e9ration de mots de passe.<\/pre>\n<\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<p>Si le param\u00e8tre\u00a0<tt>$chaine<\/tt>\u00a0est \u00ab\u00a0*\u00a0\u00bb ou \u00ab\u00a0@\u00a0\u00bb, alors ceci extrait un maximum de\u00a0<tt>$longueur<\/tt>\u00a0du param\u00e8tre de position, en commen\u00e7ant \u00e0\u00a0<tt>$position<\/tt>.<\/p>\n<pre>echo ${*:2}          # Affiche le deuxi\u00e8me param\u00e8tre de position et les suivants.\r\necho ${@:2}          # Identique \u00e0 ci-dessus.\r\n\r\necho ${*:2:3}        # Affiche trois param\u00e8tres de position, en commen\u00e7ant par le deuxi\u00e8me.<\/pre>\n<\/dd>\n<dt>expr substr $chaine $position $longueur<\/dt>\n<dd>Extrait\u00a0<em><tt>$longueur<\/tt><\/em>\u00a0caract\u00e8res \u00e0 partir de\u00a0<em><tt>$chaine<\/tt><\/em>\u00a0en commen\u00e7ant \u00e0\u00a0<em><tt>$position<\/tt><\/em>.<\/p>\n<pre>chaineZ=abcABC123ABCabc\r\n#       123456789......\r\n#       indexage base 1.\r\n\r\necho `expr substr $chaineZ 1 2`              # ab\r\necho `expr substr $chaineZ 4 3`              # ABC<\/pre>\n<p><a id=\"exprparen\" name=\"exprparen\"><\/a><\/dd>\n<dt>expr match &laquo;&nbsp;$chaine&nbsp;&raquo; &lsquo;\\($souschaine\\)&rsquo;<\/dt>\n<dd>Extrait\u00a0<em><tt>$souschaine<\/tt><\/em>\u00a0\u00e0 partir du d\u00e9but de\u00a0<em><tt>$chaine<\/tt><\/em>, et o\u00f9\u00a0<em><tt>$souschaine<\/tt><\/em>\u00a0est une\u00a0<a href=\"http:\/\/abs.traduc.org\/abs-5.3-fr\/ch17.html#regexref\">expression rationnelle<\/a>.<\/dd>\n<dt>expr &laquo;&nbsp;$chaine&nbsp;&raquo; : &lsquo;\\($souschaine\\)&rsquo;<\/dt>\n<dd>Extrait\u00a0<em><tt>$souschaine<\/tt><\/em>\u00a0\u00e0 partir du d\u00e9but de\u00a0<em><tt>$chaine<\/tt><\/em>, et o\u00f9\u00a0<em><tt>$souschaine<\/tt><\/em>\u00a0est une expression rationnelle.<\/p>\n<pre>chaineZ=abcABC123ABCabc\r\n#       =======\r\n\r\necho `expr match \"$chaineZ\" '\\(.[b-c]*[A-Z]..[0-9]\\)'`   # abcABC1\r\necho `expr \"$chaineZ\" : '\\(.[b-c]*[A-Z]..[0-9]\\)'`       # abcABC1\r\necho `expr \"$chaineZ\" : '\\(.......\\)'`                   # abcABC1\r\n# Toutes les formes ci-dessus donnent un r\u00e9sultat identique.<\/pre>\n<\/dd>\n<dt>expr match &laquo;&nbsp;$chaine&nbsp;&raquo; &lsquo;.*\\($souschaine\\)&rsquo;<\/dt>\n<dd>Extrait\u00a0<em><tt>$souschaine<\/tt><\/em>\u00a0\u00e0 la\u00a0<em>fin<\/em>\u00a0de\u00a0<em><tt>$chaine<\/tt><\/em>, et o\u00f9\u00a0<em><tt>$souschaine<\/tt><\/em>\u00a0est une expression rationnelle.<\/dd>\n<dt>expr &laquo;&nbsp;$chaine&nbsp;&raquo; : &lsquo;.*\\($souschaine\\)&rsquo;<\/dt>\n<dd>Extrait\u00a0<em><tt>$souschaine<\/tt><\/em>\u00a0\u00e0 la\u00a0<em>fin<\/em>\u00a0de\u00a0<em><tt>$chaine<\/tt><\/em>, et o\u00f9\u00a0<em><tt>$souschaine<\/tt><\/em>\u00a0est une expression rationnelle.<\/p>\n<pre>chaineZ=abcABC123ABCabc\r\n#                ======\r\n\r\necho `expr match \"$chaineZ\" '.*\\([A-C][A-C][A-C][a-c]*\\)'`    # ABCabc\r\necho `expr \"$chaineZ\" : '.*\\(......\\)'`                       # ABCabc<\/pre>\n<\/dd>\n<\/dl>\n<\/div>\n<div>\n<p><a id=\"substringremoval\" name=\"substringremoval\"><\/a><b>Suppression de sous-cha\u00eenes<\/b><\/p>\n<dl>\n<dt>${chaine#souschaine}<\/dt>\n<dd>Supprime la correspondance la plus petite de\u00a0<em><tt>$souschaine<\/tt><\/em>\u00a0\u00e0 partir du\u00a0<em>d\u00e9but<\/em>\u00a0de\u00a0<em><tt>$chaine<\/tt><\/em>.<\/dd>\n<dt>${chaine##souschaine}<\/dt>\n<dd>Supprime la correspondance la plus grande de\u00a0<em><tt>$souschaine<\/tt><\/em>\u00a0\u00e0 partir du\u00a0<em>d\u00e9but<\/em>\u00a0de\u00a0<em><tt>$chaine<\/tt><\/em>.<\/p>\n<pre>chaineZ=abcABC123ABCabc\r\n#       |----|\r\n#       |----------|\r\n\r\necho ${chaineZ#a*C}      # 123ABCabc\r\n# Supprime la plus petite correspondance entre 'a' et 'C'.\r\n\r\necho ${chaineZ##a*C}     # abc\r\n# Supprime la plus grande correspondance entre 'a' et 'C'.<\/pre>\n<\/dd>\n<dt>${chaine%souschaine}<\/dt>\n<dd>Supprime la plus petite correspondance de\u00a0<em><tt>$souschaine<\/tt><\/em>\u00a0\u00e0 partir de la\u00a0<em>fin<\/em>\u00a0de\u00a0<em><tt>$chaine<\/tt><\/em>.<\/p>\n<p>Par exemple :<\/p>\n<pre># Renomme tous les fichiers de $PWD\r\n#+ en rempla\u00e7ant le suffixe \"TXT\" par \"txt\".\r\n# Par exemple, \"fichier1.TXT\" devient \"fichier1.txt\" . . .\r\n\r\nSUFF=TXT\r\nsuff=txt\r\n\r\nfor i in $(ls *.$SUFF)\r\ndo\r\n  mv -f $i ${i%.$SUFF}.$suff\r\n  #  Ne modifie rien *en dehors* de la correspondance la plus courte\r\n  #+ commen\u00e7ant du c\u00f4t\u00e9 droit de $i . . .\r\ndone ### Ceci pourrait \u00eatre condenser en une ligne si n\u00e9cessaire.\r\n\r\n# Thank you, Rory Winston.<\/pre>\n<\/dd>\n<dt>${chaine%%souschaine}<\/dt>\n<dd>Supprime la plus grande correspondance de\u00a0<em><tt>$souschaine<\/tt><\/em>\u00a0\u00e0 partir de la\u00a0<em>fin<\/em>\u00a0de\u00a0<em><tt>$chaine<\/tt><\/em>.<\/p>\n<pre>chaineZ=abcABC123ABCabc\r\n#                    ||\r\n#        |------------|\r\n\r\necho ${chaineZ%b*c}      # abcABC123ABCa\r\n#  Supprime la plus petite correspondance entre 'b' et 'c', \u00e0 partir de la fin\r\n#+ de $chaineZ.\r\n\r\necho ${chaineZ%%b*c}     # a\r\n#  Supprime la plus petite correspondance entre 'b' et 'c', \u00e0 partir de la fin\r\n#+ de $chaineZ.<\/pre>\n<p>Cet op\u00e9rateur est utilis\u00e9 pour g\u00e9n\u00e9rer des noms de fichier.<\/p>\n<div>\n<p><a id=\"cvt\" name=\"cvt\"><\/a><b>Exemple\u00a09.12.\u00a0Convertir des formats de fichiers graphiques avec une modification du nom du fichier<\/b><\/p>\n<div>\n<pre>#!\/bin\/bash\r\n#  cvt.sh:\r\n#  Convertit les fichiers image MacPaint contenus dans un r\u00e9pertoire dans le\r\n#+ format \"pbm\".\r\n\r\n#  Utilise le binaire \"macptopbm\" provenant du paquetage \"netpbm\",\r\n#+ qui est maintenu par Brian Henderson (bryanh@giraffe-data.com).\r\n#  Netpbm est un standard sur la plupart des distributions Linux.\r\n\r\nOPERATION=macptopbm\r\nSUFFIXE=pbm         # Suffixe pour les nouveaux noms de fichiers.\r\n\r\nif [ -n \"$1\" ]\r\nthen\r\n  repertoire=$1      # Si le nom du r\u00e9pertoire donn\u00e9 en argument au script...\r\nelse\r\n  repertoire=$PWD    # Sinon, utilise le r\u00e9pertoire courant.\r\nfi  \r\n\r\n#  Suppose que tous les fichiers du r\u00e9pertoire cible sont des fichiers image\r\n# + MacPaint avec un suffixe de nom de fichier \".mac\".\r\n\r\nfor fichier in $repertoire\/*  # Filename globbing.\r\ndo\r\n  nomfichier=${fichier%.*c} #  Supprime le suffixe \".mac\" du nom du fichier\r\n                            #+ ('.*c' correspond \u00e0 tout ce qui se trouve\r\n                            #+ entre '.' et 'c', inclus).\r\n  $OPERATION $fichier &gt; $nomfichier.$SUFFIXE\r\n    # Redirige la conversion vers le nouveau nom du fichier.\r\n    rm -f $fichier          # Supprime le fichier original apr\u00e8s sa convertion.\r\n  echo \"$nomfichier.$SUFFIXE\"  # Trace ce qui se passe sur stdout.\r\ndone\r\n\r\nexit 0\r\n\r\n# Exercice\r\n# --------\r\n#  \u00c0 ce stade, ce script convertit *tous* les fichiers du r\u00e9pertoire courant.\r\n#  Modifiez le pour qu'il renomme *seulement* les fichiers dont l'extension est\r\n#+ \".mac\".<\/pre>\n<\/div>\n<\/div>\n<div>\n<p><a id=\"ra2ogg\" name=\"ra2ogg\"><\/a><b>Exemple\u00a09.13.\u00a0Convertir des fichiers audio en\u00a0<em>ogg<\/em><\/b><\/p>\n<div>\n<pre>#!\/bin\/bash\r\n# ra2ogg.sh : Convertit des fichiers audio de streaming (*.ra) en ogg.\r\n\r\n# Utilise le programme \"mplayer\" :\r\n#      http:\/\/www.mplayerhq.hu\/homepage\r\n#      Vous aurez peut-\u00eatre besoin d'installer les codecs appropri\u00e9s\r\n#+     pour que ce script fonctionne.\r\n# Utilise la biblioth\u00e8que \"ogg\" et \"oggenc\" :\r\n#      http:\/\/www.xiph.org\/\r\n\r\nPREFIXE_FICHIER_RESULTAT=${1%%ra}      # Supprime le suffixe \"ra\".\r\nSUFFIXE_FICHIER_RESULTAT=wav           # Suffixe pour le fichier wav.\r\nFICHIER_RESULTAT=\"$PREFIXE_FICHIER_RESULTAT\"\"$SUFFIXE_FICHIER_RESULTAT\"\r\nE_SANSARGS=65\r\n\r\nif [ -z \"$1\" ]          # Un nom de fichier \u00e0 convertir doit \u00eatre sp\u00e9cifi\u00e9.\r\nthen\r\n  echo \"Usage: `basename $0` [nom_fichier]\"\r\n  exit $E_SANSARGS\r\nfi\r\n\r\n##########################################################################\r\nmplayer \"$1\" -ao pcm:file=$FICHIER_RESULTAT\r\noggenc \"$FICHIER_RESULTAT\"  # Corrige l'extension du fichier ajout\u00e9e automatiquement pas oggenc.\r\n##########################################################################\r\n\r\nrm \"$FICHIER_RESULTAT\"      # Supprime le fichier temporaire *.wav.\r\n                   # Si vous voulez le conserver, commentez la ligne ci-dessus.\r\n\r\nexit $?\r\n\r\n#  Note :\r\n#  -----\r\n#  Sur un site web, cliquer seulement sur un fichier audio *.ram\r\n#+ r\u00e9cup\u00e8re l'URL du fichier audio, le fichier *.ra.\r\n#  Vous pouvez ensuite utiliser \"wget\" ou un autre outil similaire\r\n#+ pour t\u00e9l\u00e9charger vous-m\u00eame le fichier *.ra.\r\n\r\n#  Exercices :\r\n#  ----------\r\n#  Actuellement, ce script convertit seulement les noms de fichier *.ra.\r\n#  Ajoutez de la flexibilit\u00e9 en autorisant l'utilisation de *.ram et d'autres noms de fichier.\r\n#\r\n#  Si vous \u00eates r\u00e9ellement ambitieux, \u00e9tendez le script pour r\u00e9aliser automatiquement\r\n#+ les t\u00e9l\u00e9chargements et les convertions des fichiers audio.\r\n#  \u00c0 partir d'une URL, r\u00e9cup\u00e9rez les fichiers audio (en utilisant \"wget\")\r\n#+ et convertissez-les.<\/pre>\n<\/div>\n<\/div>\n<p><a id=\"getoptsimple1\" name=\"getoptsimple1\"><\/a>Une simple \u00e9mulation de\u00a0<a href=\"http:\/\/abs.traduc.org\/abs-5.3-fr\/ch15s09.html#getopty\">getopt<\/a>\u00a0en utilisant des constructions d&rsquo;extraction de sous-cha\u00eenes.<\/p>\n<div>\n<p><a id=\"getoptsimple\" name=\"getoptsimple\"><\/a><b>Exemple\u00a09.14.\u00a0\u00c9muler\u00a0<em>getopt<\/em><\/b><\/p>\n<div>\n<pre>#!\/bin\/bash\r\n# getopt-simple.sh\r\n# Auteur : Chris Morgan\r\n# Utilis\u00e9 dans le guide ABS avec sa permission.\r\n\r\ngetopt_simple()\r\n{\r\n    echo \"getopt_simple()\"\r\n    echo \"Les param\u00e8tres sont '$*'\"\r\n    until [ -z \"$1\" ]\r\n    do\r\n      echo \"Traitement du param\u00e8tre : '$1'\"\r\n      if [ ${1:0:1} = '\/' ]\r\n      then\r\n          tmp=${1:1}               # Supprime le '\/' devant...\r\n          parametre=${tmp%%=*}     # Extrait le nom.\r\n          valeur=${tmp##*=}        # Extrait la valeur.\r\n          echo \"Param\u00e8tre : '$parametre', valeur: '$valeur'\"\r\n          eval $parametre=$valeur\r\n      fi\r\n      shift\r\n    done\r\n}\r\n\r\n# Passe toutes les options \u00e0 getopt_simple().\r\ngetopt_simple $*\r\n\r\necho \"test vaut '$test'\"\r\necho \"test2 vaut '$test2'\"\r\n\r\nexit 0\r\n\r\n---\r\n\r\nsh getopt_example.sh \/test=valeur1 \/test2=valeur2\r\n\r\nLes param\u00e8tres sont '\/test=valeur1 \/test2=valeur2'\r\nTraitement du param\u00e8tre : '\/test=valeur1'\r\nParam\u00e8tre : 'test', valeur: 'valeur1'\r\nTraitement du param\u00e8tre : '\/test2=valeur2'\r\nParam\u00e8tre : 'test2', valeur : 'valeur2'\r\ntest vaut 'valeur1'\r\ntest2 vaut 'valeur2'<\/pre>\n<\/div>\n<\/div>\n<\/dd>\n<\/dl>\n<\/div>\n<div>\n<p><a id=\"substringreplacement\" name=\"substringreplacement\"><\/a><b>Remplacement de sous-cha\u00eene<\/b><\/p>\n<dl>\n<dt><a id=\"substrrepl00\" name=\"substrrepl00\"><\/a>${chaine\/souschaine\/remplacement}<\/dt>\n<dd>Remplace la premi\u00e8re correspondance de\u00a0<em><tt>$souschaine<\/tt><\/em>\u00a0par\u00a0<em><tt>$remplacement<\/tt><\/em>.<\/dd>\n<dt><a id=\"substrrepl01\" name=\"substrrepl01\"><\/a>${chaine\/\/souschaine\/remplacement}<\/dt>\n<dd>Remplace toutes les correspondances de\u00a0<em><tt>$souschaine<\/tt><\/em>\u00a0avec\u00a0<em><tt>$remplacement<\/tt><\/em>.<\/p>\n<pre>chaineZ=abcABC123ABCabc\r\n\r\necho ${chaineZ\/abc\/xyz}           # xyzABC123ABCabc\r\n                                  #  Remplace la premi\u00e8re correspondance de\r\n                                  #+ 'abc' avec 'xyz'.\r\n\r\necho ${chaineZ\/\/abc\/xyz}          # xyzABC123ABCxyz\r\n                                  #  Remplace toutes les correspondances de\r\n                                  #+ 'abc' avec 'xyz'.<\/pre>\n<\/dd>\n<dt><a id=\"substrrepl02\" name=\"substrrepl02\"><\/a>${chaine\/#souschaine\/remplacement}<\/dt>\n<dd>Si\u00a0<em><tt>$souschaine<\/tt><\/em>\u00a0correspond au\u00a0<em>d\u00e9but<\/em>\u00a0de\u00a0<em><tt>$chaine<\/tt><\/em>, substitue\u00a0<em><tt>$remplacement<\/tt><\/em>\u00a0\u00e0\u00a0<em><tt>$souschaine<\/tt><\/em>.<\/dd>\n<dt><a id=\"substrrepl03\" name=\"substrrepl03\"><\/a>${chaine\/%souchaine\/remplacement}<\/dt>\n<dd>Si\u00a0<em><tt>$souschaine<\/tt><\/em>\u00a0correspond \u00e0 la\u00a0<em>fin<\/em>\u00a0de\u00a0<em><tt>$chaine<\/tt><\/em>, substitue\u00a0<em><tt>$remplacement<\/tt><\/em>\u00a0\u00e0\u00a0<em><tt>$souschaine<\/tt><\/em>.<\/p>\n<pre>chaineZ=abcABC123ABCabc\r\n\r\necho ${chaineZ\/#abc\/XYZ}          # XYZABC123ABCabc\r\n                                  #  Remplace la correspondance de fin de\r\n                                  #+ 'abc' avec 'XYZ'.\r\n\r\necho ${chaineZ\/%abc\/XYZ}          # abcABC123ABCXYZ\r\n                                  #  Remplace la correspondance de fin de\r\n                                  #+ 'abc' avec 'XYZ'.<\/pre>\n<\/dd>\n<\/dl>\n<\/div>\n<div lang=\"fr\" xml:lang=\"fr\">\n<div>\n<p><a id=\"awkstringmanip\" name=\"awkstringmanip\"><\/a><\/p>\n<h2>9.2.1. Manipuler des cha\u00eenes de caract\u00e8res avec awk<\/h2>\n<\/div>\n<p><a id=\"awkstringmanip2\" name=\"awkstringmanip2\"><\/a>Un script Bash peut utiliser des fonctionnalit\u00e9s de manipulation de cha\u00eenes de caract\u00e8res de\u00a0<a href=\"http:\/\/abs.traduc.org\/abs-5.3-fr\/apcs02.html#awkref\">awk<\/a>\u00a0comme alternative \u00e0 ses propres fonctions int\u00e9gr\u00e9es.<\/p>\n<div>\n<p><a id=\"substringex\" name=\"substringex\"><\/a><b>Exemple\u00a09.15.\u00a0Autres moyens d&rsquo;extraire des sous-cha\u00eenes<\/b><\/p>\n<div>\n<pre>#!\/bin\/bash\r\n# substring-extraction.sh\r\n\r\nChaine=23skidoo1\r\n#      012345678    Bash\r\n#      123456789    awk\r\n# Notez les diff\u00e9rents syst\u00e8mes d'indexation de cha\u00eenes :\r\n# Bash compte le premier caract\u00e8re d'une cha\u00eene avec '0'.\r\n# Awk  compte le premier caract\u00e8re d'une cha\u00eene avec '1'.\r\n\r\necho ${Chaine:2:4} # position 3 (0-1-2), longueur de quatre caract\u00e8res\r\n                                         # skid\r\n\r\n# L'\u00e9quivalent awk de ${string:position:longueur} est substr(string,position,longueur).\r\necho | awk '\r\n{ print substr(\"'\"${Chaine}\"'\",3,4)      # skid\r\n}\r\n'\r\n#  Envoy\u00e9 un \"echo\" vide \u00e0 awk donne une entr\u00e9e inutile, et donc permet d'\u00e9viter\r\n#+ d'apporter un nom de fichier.\r\n\r\nexit 0<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div lang=\"fr\" xml:lang=\"fr\">\n<div>\n<p><a id=\"strfdisc\" name=\"strfdisc\"><\/a><\/p>\n<h2>9.2.2. Discussion plus avanc\u00e9e<\/h2>\n<\/div>\n<p>Pour plus d&rsquo;informations sur la manipulation des cha\u00eenes de caract\u00e8res dans les scripts, r\u00e9f\u00e9rez-vous \u00e0 la\u00a0<a title=\"9.3.\u00a0Substitution de param\u00e8tres\" href=\"http:\/\/abs.traduc.org\/abs-5.3-fr\/ch09s03.html\">Section\u00a09.3, \u00ab\u00a0Substitution de param\u00e8tres\u00a0\u00bb<\/a>\u00a0et \u00e0 la\u00a0<a href=\"http:\/\/abs.traduc.org\/abs-5.3-fr\/ch15s02.html#expextrsub\">section consacr\u00e9e<\/a>\u00a0\u00e0 la commande\u00a0<a href=\"http:\/\/abs.traduc.org\/abs-5.3-fr\/ch15s02.html#exprref\">expr<\/a>. Pour des exemples de scripts, jetez un oeil sur les exemples suivants :<\/p>\n<div>\n<ol type=\"1\">\n<li><a title=\"Exemple\u00a015.9.\u00a0Utiliser expr\" href=\"http:\/\/abs.traduc.org\/abs-5.3-fr\/ch15s02.html#ex45\">Exemple\u00a015.9, \u00ab\u00a0Utiliser\u00a0<em>expr<\/em>\u00a0\u00bb<\/a><\/li>\n<li><a title=\"Exemple\u00a09.18.\u00a0Longueur d'une variable\" href=\"http:\/\/abs.traduc.org\/abs-5.3-fr\/ch09s03.html#length\">Exemple\u00a09.18, \u00ab\u00a0Longueur d&rsquo;une variable\u00a0\u00bb<\/a><\/li>\n<li><a title=\"Exemple\u00a09.19.\u00a0Correspondance de mod\u00e8le dans la substitution de param\u00e8tres\" href=\"http:\/\/abs.traduc.org\/abs-5.3-fr\/ch09s03.html#pattmatching\">Exemple\u00a09.19, \u00ab\u00a0Correspondance de mod\u00e8le dans la substitution de param\u00e8tres\u00a0\u00bb<\/a><\/li>\n<li><a title=\"Exemple\u00a09.20.\u00a0Renommer des extensions de fichiers :\" href=\"http:\/\/abs.traduc.org\/abs-5.3-fr\/ch09s03.html#rfe\">Exemple\u00a09.20, \u00ab\u00a0Renommer des extensions de fichiers\u00a0:\u00a0\u00bb<\/a><\/li>\n<li><a title=\"Exemple\u00a09.22.\u00a0Mod\u00e8les correspondant au pr\u00e9fixe ou au suffixe d'une cha\u00eene de caract\u00e8res\" href=\"http:\/\/abs.traduc.org\/abs-5.3-fr\/ch09s03.html#varmatch\">Exemple\u00a09.22, \u00ab\u00a0Mod\u00e8les correspondant au pr\u00e9fixe ou au suffixe d&rsquo;une cha\u00eene de caract\u00e8res\u00a0\u00bb<\/a><\/li>\n<li><a title=\"Exemple\u00a0A.38.\u00a0Tri d'insertion\" href=\"http:\/\/abs.traduc.org\/abs-5.3-fr\/apa.html#insertionsort\">Exemple\u00a0A.38, \u00ab\u00a0Tri d&rsquo;insertion\u00a0\u00bb<\/a><\/li>\n<li><a title=\"Exemple\u00a0A.41.\u00a0Quacky : un jeu de mots de type Perquackey\" href=\"http:\/\/abs.traduc.org\/abs-5.3-fr\/apa.html#qky\">Exemple\u00a0A.41, \u00ab\u00a0Quacky : un jeu de mots de type Perquackey\u00a0\u00bb<\/a><\/li>\n<\/ol>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>http:\/\/abs.traduc.org\/abs-5.3-fr\/ch09s02.html &nbsp; Bash supporte un nombre surprenant d&rsquo;op\u00e9rations de manipulation de cha\u00eenes de caract\u00e8res. Malheureusement, ces outils manquent d&rsquo;unit\u00e9. Certains sont un sous-ensemble de la\u00a0substitution de param\u00e8tre\u00a0et les autres font partie des fonctionnalit\u00e9s de la commande UNIX\u00a0expr. Ceci produit une syntaxe de commande non unifi\u00e9e et des fonctionnalit\u00e9s qui se recoupent, sans parler de la &hellip; <a href=\"http:\/\/les-fougs.com\/wordpress\/2016\/10\/10\/manipuler-les-chaines-de-caracteres\/\" class=\"more-link\">Continuer la lecture<span class=\"screen-reader-text\"> de &laquo;&nbsp;Manipuler les cha\u00eenes de caract\u00e8res&nbsp;&raquo;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[51,53],"tags":[],"_links":{"self":[{"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/posts\/1234"}],"collection":[{"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/comments?post=1234"}],"version-history":[{"count":1,"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/posts\/1234\/revisions"}],"predecessor-version":[{"id":1856,"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/posts\/1234\/revisions\/1856"}],"wp:attachment":[{"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/media?parent=1234"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/categories?post=1234"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/tags?post=1234"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}