Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
issue81:c_c [2014/05/09 12:12] – lecastillan | issue81:c_c [2014/05/14 12:56] (Version actuelle) – andre_domenech |
---|
**Titre : Courriers des lecteurs - Sed** | **Titre : Courriers des lecteurs - Sed** |
| |
**Le mois dernier, j'ai reçu un courriel de John, un lecteur de C & C. Il s'était tourné vers moi pour des conseils sur l'utilisation de Sed pour insérer des points-virgules dans un fichier texte créé par TaskWarrior. Il voulait faire cela afin d'utiliser le script de conkytext pour formater la « To-Do List » et l'afficher via son Conky ; le fichier créé dans TaskWarrior était joint à l'email. Nous avons ensuite passé quelques jours à concocter un script Sed fonctionnel (en changeant plusieurs fois de structure), et nous avons pensé que le résultat final était une excellente base pour la rédaction d'un article. Espérons que d'ici à la fin de cet article, le lecteur aura une idée précise sur la façon d'aborder les expressions SED pour pouvoir s'attaquer à des tâches qui peuvent à première vue sembler complexes. | **Le mois dernier, j'ai reçu un courriel de John, un lecteur de C & C. Il s'était tourné vers moi pour des conseils sur l'utilisation de Sed pour insérer des points-virgules dans un fichier texte créé par TaskWarrior. Il voulait faire cela afin d'utiliser le script de conkytext pour formater la « To-Do List » et l'afficher via son Conky ; le fichier créé dans TaskWarrior était joint à l'e-mail. Nous avons ensuite passé quelques jours à concocter un script Sed fonctionnel (en changeant plusieurs fois de structure), et nous avons pensé que le résultat final était une excellente base pour la rédaction d'un article. Espérons que d'ici à la fin de cet article, le lecteur aura une idée précise sur la façon d'aborder les expressions Sed pour pouvoir s'attaquer à des tâches qui peuvent à première vue sembler complexes. |
** | ** |
| |
• If you want the same formatting at the end, the RHS of the expression should almost always be the same, and if it isn't, it's an indicator that you're either going too complicated, or the chunk you're working on is too big, so try to break it down some more. | • If you want the same formatting at the end, the RHS of the expression should almost always be the same, and if it isn't, it's an indicator that you're either going too complicated, or the chunk you're working on is too big, so try to break it down some more. |
| |
** Quelques conseils sur la façon de faire pour chaque expression : Déterminez où vous devez insérer le caractère, car c'est cela qui définira où placer les groupes (dans notre cas, avant les espaces, donc le deuxième groupe commence presque toujours avant le caractère Espace) | ** Quelques conseils sur la façon de faire pour chaque expression : Déterminez où vous devez insérer le caractère, car c'est cela qui définira où placer les groupes (dans notre cas, avant les espaces, donc le deuxième groupe commence presque toujours avant le caractère Espace). |
• Travaillez par petits bouts. Commencez par une commande sed simple comme : sed -e "s/^[0-9]*/FC/g" (FC pour first column - première colonne). Cela recherche toute ligne commençant par un nombre et remplace celui-ci par « FC » pour vous permettre de vérifier, de visu, le résultat. Faire comme cela m'a fait comprendre que tous les ID à un chiffre commencent par un espace et m'a aidé à formuler l'expression pour cela. Ce n'est pas en fait inclus dans le fichier, puisque le formatage de a évolué depuis. Dès que vous avez une commande fonctionnelle pour l'objectif que vous vous êtes fixé, vous pouvez vous attaquer à la deuxième expression. | • Travaillez par petits bouts. Commencez par une commande sed simple comme : sed -e "s/^[0-9]*/FC/g" (FC pour first column - première colonne). Cela recherche toute ligne commençant par un nombre et remplace celui-ci par « FC » pour vous permettre de vérifier, //de visu//, le résultat. Faire comme cela m'a fait comprendre que tous les ID à un chiffre commencent par une espace et m'a aidé à formuler l'expression pour cela. Ce n'est pas en fait inclus dans le fichier, puisque le formatage de fin a évolué depuis. Dès que vous avez une commande fonctionnelle pour l'objectif que vous vous êtes fixé, vous pouvez vous attaquer à la deuxième expression. |
• Si vous avez des problèmes avec l'étape 2 parce que vous n'arrivez pas à faire fonctionner les expressions régulières, utilisez grep avec la même expression régulière. Cela vous permet d'éliminer la possibilité que l'expression, en elle-même, est incorrecte et indique que c'est une bizarrerie de sed que vous n'avez pas encore prise en compte. | • Si vous avez des problèmes avec l'étape 2 parce que vous n'arrivez pas à faire fonctionner les expressions régulières, utilisez grep avec la même expression régulière. Cela vous permet d'éliminer la possibilité que l'expression, en elle-même, est incorrecte et indique que c'est une bizarrerie de sed que vous n'avez pas encore prise en compte. |
• Si vous voulez le même formatage à la fin de la commande, le coté droit (RHS) de l'expression devrait presque toujours être le même et, s'il ne l'est pas, cela peut indiquer soit que vous commencez à trop compliquer les choses, soit que la partie sur laquelle vous travaillez est trop grande. Dans ce cas, essayez de le décomposer davantage. | • Si vous voulez le même formatage à la fin de la commande, le côté droit (RHS) de l'expression devrait presque toujours être le même et, s'il ne l'est pas, cela peut indiquer soit que vous commencez à trop compliquer les choses, soit que la partie sur laquelle vous travaillez est trop grande. Dans ce cas, essayez de le décomposer davantage. |
** | ** |
| |
fourth_expression="s/\(^[0-9]*\stasks\)/\;\;\;\1/g" | fourth_expression="s/\(^[0-9]*\stasks\)/\;\;\;\1/g" |
| |
fifth_expression="s/\(^[A-Z]*\)\(\s*[a-zA-Z]\)/\1\;\2/g" # Check for any number of capital letters at the start of a line, followed by a space and more text, and insert a semicolon. | fifth_expression="s/\(^[A-Z]*\)\(\s*[a-zA-Z]\)/\1\;\2/g" |
| |
**# Recherche chaque ligne commençant par un chiffre quelconque ou une lettre majuscule suivis par un espace et un autre texte et insère un point-virgule.** | **Les Expressions |
| |
| first_expression="s/\([a-zA-Z0-9]\)\(\s\{2,15\}\)/\1\;\2/g" |
| |
| second_expression="s/\([0-9]\{3\}\)\(\s[a-zA-Z0-9]\)/\1\;\2/g" |
| |
| third_expression="s/\([a-zA-Z]\)\(\s[0-9]\{1,2\}\/\)/\1\;\2/g" |
| |
| fourth_expression="s/\(^[0-9]*\stasks\)/\;\;\;\1/g" |
| |
| fifth_expression="s/\(^[A-Z]*\)\(\s*[a-zA-Z]\)/\1\;\2/g" ** |
| |
| |
| # Check for any number of capital letters at the start of a line, followed by a space and more text, and insert a semicolon. |
| |
| **# Recherchez chaque ligne commençant par une ou plusieurs lettres majuscules suivies d'une espace et encore du texte et insérez un point-virgule.** |
| |
| |
**Les explications** | **Les explications** |
| |
**La première expression dit à Sed "Cherche n'importe quel caractère ( az, AZ , ou 0-9) , et regarde s'il est suivi par deux ou plusieurs espaces, puis ajoute un point-virgule avant les espaces". L'astuce consiste à savoir que Sed peut vérifier un groupe de correspondances contenant des valeurs régulières. C'est pourquoi nous avons mis les expressions entre parenthèses. " \ ( A-zA- Z0-9 ] \ ) " groupe qui devient alors notre référence arrière "\1" dans la section de remplacement de Sed. Nous formons essentiellement deux groupes - le caractère qui précède les espaces et les espaces eux-mêmes. Ensuite, dans l'étape de remplacement, on insère un point-virgule entre les deux groupes. Cela correspond à la colonne 2 et la colonne 4 dans notre fichier, ainsi que tous les en-têtes à l'exception de ID. La raison pour laquelle ID n'est pas inclus est due au fait que nous indiquons deux ou plusieurs espaces, et que le fait d'indiquer un ou plusieurs espaces pourraient poser problème pour les contenus de la colonne Description. Remarque: Le point-virgule doit être « échappé » (par un antislash devant). Aussi, si vous voulez faire indiquer plus de 15 espaces, il suffit de de ne rien mettre après la virgule - \{2,\}.** | **La première expression dit à Sed « Cherche n'importe quel caractère (a-z, A-Z ou 0-9), et regarde s'il est suivi par deux ou plusieurs espaces, puis ajoute un point-virgule avant les espaces ». L'astuce consiste à savoir que Sed peut créer des ensembles de correspondances aux valeurs régulières. C'est pourquoi nous avons mis les expressions entre des parenthèses incomplètes. « \(a-zA-Z0-9]\) » devient alors notre correspondance « \1 » dans la section de remplacement de Sed. Nous formons en fait deux groupes : le caractère qui précède les espaces et les espaces eux-mêmes. Ensuite, dans l'étape de remplacement, on insère un point-virgule entre les deux groupes. Cela correspond à la colonne 2 et la colonne 4 dans notre fichier, ainsi que tous les en-têtes à l'exception de ID. ID n'est pas inclus parce que nous indiquons deux ou plusieurs espaces, et que le fait d'indiquer une ou plusieurs espaces pourraient poser problème dans toutes les description. Remarque : Le point-virgule doit être « échappé » (par un antislash devant). Aussi, si vous voulez rechercher les correspondances à plus de 15 espaces, il suffit de de ne rien mettre après la virgule - \{2,\}.** |
| |
The second expression tells Sed “Look for any 3 consecutive digits that are followed by a space and a letter or number, then insert a semi-colon”. What this matches is the date – the format of the date is always going to be so long that only one space is inserted between columns. Naturally, you could check for any number of spaces, but that could cause issues if you use numbers in your Projects. This will apply to any format of date where the year is at the end. This handles column 3 in our file. | The second expression tells Sed “Look for any 3 consecutive digits that are followed by a space and a letter or number, then insert a semi-colon”. What this matches is the date – the format of the date is always going to be so long that only one space is inserted between columns. Naturally, you could check for any number of spaces, but that could cause issues if you use numbers in your Projects. This will apply to any format of date where the year is at the end. This handles column 3 in our file. |
| |
**La seconde expression dit à Sed "Recherche 3 chiffres consécutifs qui sont suivis par un espace et une lettre ou un chiffre, puis insère un point-virgule ". Ce que nous cherchons à trouver, c'est la date - le format de la date sera toujours aussi long et un seul espace sépare la date de la colonne suivante. Bien sûr, on pourrait chercher un certain nombre d'espaces, mais cela pourrait nous causer des problèmes au cas où la description de la tâche contiendrait des chiffres. Cela s'applique à tout format de date où l'année est à la fin. Cela gère la colonne 3 dans notre fichier.** | **La seconde expression dit à Sed « Recherche 3 chiffres consécutifs qui sont suivis par une espace et une lettre ou un chiffre, puis insère un point-virgule ». Cela correspond à la date - le format de la date sera toujours si long qu'une seule espace sépare la date de la colonne suivante. Bien sûr, on pourrait chercher un nombre quelconque d'espaces, mais cela pourrait causer des problèmes au cas où la description de la tâche contiendrait des chiffres. Cela s'applique à tout format de date où l'année est à la fin. Cela gère la colonne 3 dans notre fichier.** |
| |
The third expression can be translated as “Find all letters followed by a 1 or 2 digit number, followed by a slash, and insert the semi-colon.” The only column that contains a slash is our formatted date column – this applies therefore to the column before it (Project). The reason why I didn't include numbers in this case, is because the second expression could handle this if you tell Sed to accept any number of spaces after the 3 digits. This handles column 2 in our file. | The third expression can be translated as “Find all letters followed by a 1 or 2 digit number, followed by a slash, and insert the semi-colon.” The only column that contains a slash is our formatted date column – this applies therefore to the column before it (Project). The reason why I didn't include numbers in this case, is because the second expression could handle this if you tell Sed to accept any number of spaces after the 3 digits. This handles column 2 in our file. |
| |
**La troisième expression peut être traduite comme suit " Recherche toutes lettres suivies par un nombre de 1 ou 2 chiffres, suivis d'un slash et, insère un point-virgule ". La seule colonne qui contient une barre oblique est notre colonne de date - cela s'applique donc la colonne « Project ». La raison pour laquelle je n'ai pas inclus des chiffres dans ce cas est parce que la deuxième expression pourrait gérer cela si vous dites à Sed d'accepter un certain nombre d'espaces après les 3 chiffres. Cela gère donc la colonne 2 de notre fichier .** | **La troisième expression peut être traduite comme « Recherche toutes lettres suivies par un nombre de 1 ou 2 chiffres, suivis d'un slash (ou barre oblique) et insère un point-virgule ». La seule colonne qui contient une barre oblique est notre colonne de date, cela s'applique donc à la colonne juste avant, « Project ». Si je n'ai pas inclus des chiffres dans ce cas, c'est parce que la deuxième expression pourrait gérer cela si vous dites à Sed d'accepter un certain nombre d'espaces après les 3 chiffres. Cela gère donc la colonne 2 de notre fichier .** |
| |
The fourth expression handles the last line of the file, and inserting the 3 semi-colons before tasks. It essentially groups the entire line (10 tasks) and then inserts three semi-colons before that group. If you're adding semi-colons before any lines starting with numbers, then you should move this expression to the start of the list of expressions, so Sed doesn't match it. | The fourth expression handles the last line of the file, and inserting the 3 semi-colons before tasks. It essentially groups the entire line (10 tasks) and then inserts three semi-colons before that group. If you're adding semi-colons before any lines starting with numbers, then you should move this expression to the start of the list of expressions, so Sed doesn't match it. |
| |
**La quatrième expression gère la dernière ligne du fichier, et en insérant les trois points-virgules avant « tasks ». Le groupe traité concerne toute la ligne ( 10 tasks ), puis insère trois points-virgules avant de ce groupe. Si vous ajoutez un point-virgule avant toutes les lignes commençant par des chiffres, alors vous devez passer cette expression au début de la liste des expressions, de sorte que Sed ne la sélectionne pas. | **La quatrième expression gère la dernière ligne du fichier et insère les trois points-virgules avant « tasks ». En fait, il fait de la ligne entière (10 tasks) un groupe, puis insère trois points-virgules avant ce groupe. Si vous ajoutez un point-virgule avant toutes les lignes commençant par des chiffres, alors vous devez passer cette expression au début de la liste des expressions, de sorte que Sed ne la sélectionne pas. |
** | ** |
| |
The fifth expression simply states “Find the line that starts with any number of capital letters, and insert a space afterwards”. I go a little more specific, and state “followed by any number of spaces and more letters”. However, it's not necessary in our example, and is simply there to be a bit more robust. | The fifth expression simply states “Find the line that starts with any number of capital letters, and insert a space afterwards”. I go a little more specific, and state “followed by any number of spaces and more letters”. However, it's not necessary in our example, and is simply there to be a bit more robust. |
| |
**La cinquième expression indique tout simplement "Trouve la ligne qui commence avec un nombre quelconque de lettres majuscules, et insère un espace après". Je vais plus dans le détail et je précise " suivi par un nombre quelconque d'espaces et autres lettres ". Cependant , ce n'est pas nécessaire dans notre exemple, et c'est juste là pour que cela soit un peu plus fiable. | **La cinquième expression indique tout simplement « Trouve la ligne qui commence avec un nombre quelconque de lettres majuscules et insère une espace après ». Je deviens plus précis en annonçant « suivi par un nombre quelconque d'espaces et autres lettres ». Cependant, ce n'est pas nécessaire dans notre exemple et ce n'est là que pour que cela soit un peu plus fiable.** |
** | |
| |
That about covers the steps I undertook in this scenario. I realize that this is a relatively specific occasion, and not everyone will want to have this exact formatting. My hope is that following my process will help you understand how to approach these sorts of problems. If it's wished for, I can spend an article focusing on short formatting problems, and working through it step by step. If anyone is interested in that sort of article, please let me know via email. As always, any questions/concerns or requests can be directed to me at lswest34+fcm@gmail.com. | That about covers the steps I undertook in this scenario. I realize that this is a relatively specific occasion, and not everyone will want to have this exact formatting. My hope is that following my process will help you understand how to approach these sorts of problems. If it's wished for, I can spend an article focusing on short formatting problems, and working through it step by step. If anyone is interested in that sort of article, please let me know via email. As always, any questions/concerns or requests can be directed to me at lswest34+fcm@gmail.com. |
| |
**Cet article couvre donc les étapes nécessaires pour résoudre ce problème. Mais je suis d'accord avec vous c'est un peu spécifique et, cet exercice de mise en forme détaillée ne va pas être utile à tout le monde. Néanmoins, j'espère que suite à ma démarche, cela vous aidera à mieux comprendre la manière dont on aborde ce genre de problème. Si vous le souhaitez, je peux rédiger d'autres articles en ce sens et en me concentrant sur de petits problèmes de mise en forme et ce, étape par étape. Si quelqu'un est intéressé par ce genre d'article, s'il vous plaît envoyez moi un mail. Comme toujours, adressez-moi un email pour toutes questions, préoccupations ou demandes en écrivant à lswest34 + fcm@gmail.com.** | **Et voilà pour les étapes par lesquelles je suis passé dans ce scénario. Mais je me rends compte que c'est un peu spécifique et que cet exercice de mise en forme détaillée ne va pas être utile à tout le monde. Néanmoins, j'espère qu'en suivant ma démarche, vous comprendrez mieux comment aborder ce genre de problème. Si vous le souhaitez, je peux rédiger un autre article en me concentrant sur de petits problèmes de mise en forme et ce, étape par étape. Si quelqu'un est intéressé par ce genre d'article, n'hésitez pas à m'envoyer un mail. Comme toujours, adressez-moi un e-mail pour toutes questions, préoccupations ou demandes en écrivant à lswest34 + fcm@gmail.com.** |