9 façons de modifier le texte avec la commande SED sur Linux


L'un des outils de référence pour l'édition de texte dans Linux est SED, l'éditeur de flux. C'est un éditeur de texte sans interface qui effectue des opérations tranquillement, directement à partir de la ligne de commande. Des correctifs rapides aux transformations de texte avancées, voici neuf façons dont la commande SED facilite l'édition.

1

Trouver et remplacer le texte (de base et ciblé)

Le remplacement du texte est l'utilisation la plus courante de SED. Je l'utilise le plus souvent lorsque je travaille avec des fichiers volumineux dans un terminal car je ne veux pas ouvrir un éditeur de texte séparé uniquement pour trouver et remplacer le texte. La course à pied directement à partir du terminal augmente non seulement mon efficacité et ma vitesse, mais me donne également plus d'options de personnalisation qu'une boîte de dialogue de recherche et de remplacement normal.

La syntaxe de base pour trouver et remplacer le texte est simple.

sed 's/old/new/' file.txt
Trouver et remplacer le contenu à l'aide de la commande SED

Ici, la commande S signifie substitut, ancien est le texte que vous recherchez (Flameshot dans mon cas), et nouveau est le texte avec lequel vous souhaitez le remplacer (par exemple Gradia).

Par défaut, SED remplace uniquement la première occurrence sur chaque ligne. Cependant, dans de nombreuses situations, vous devez échanger toutes les occurrences du mot ciblé. Pour ce faire, ajoutez le drapeau global à la fin:

sed 's/old/new/g' file.txt

Maintenant, chaque occurrence de chaque ligne est remplacé.

Vous pouvez également remplacer le texte sur une ligne spécifique en spécifiant le numéro de ligne avant l'option S:

sed '10s/old/new/' file.txt

Cette commande remplace l'ancien texte par un nouveau texte sur la ligne 10 uniquement. De même, vous pouvez remplacer le texte dans une plage de lignes en spécifiant les numéros de ligne de démarrage et de fin, séparés par une virgule, avant le drapeau S:

sed '10,20s/old/new/' file.txt

Au-delà des remplacements spécifiques à la ligne, vous pouvez être encore plus sélectif en disant à SED d'agir uniquement si une ligne correspond à un certain motif:

sed '/ERROR/s/old/new/g' file.txt
Trouver et remplacer uniquement la ligne spécifique en fonction du motif.

De cette façon, SED remplace le texte uniquement dans les lignes qui correspondent au modèle (comme l'erreur dans ce cas) tout en laissant le reste intact.

2

Insertion, appuyer et supprimer le contenu

En travaillant avec des fichiers, les trois tâches que j'effectent le plus souvent insérer, ajouter et supprimer le contenu. Avec SED, je peux gérer les trois en douceur et efficacement sans jamais ouvrir le fichier dans un éditeur.

Commençons par l'insertion. En utilisant SED, vous pouvez ajouter du contenu à n'importe quel emplacement du fichier – avant ou après une ligne spécifique. Par exemple, si vous travaillez avec un fichier de configuration et que vous souhaitez ajouter un nouveau paramètre avant la ligne 3, vous pouvez le faire avec l'indicateur I:

sed '3i\
# New setting\
ENABLE_FEATURE=true' config.conf
Insertion du contenu dans le fichier de configuration à l'aide de la commande SED

De même, si vous voulez que le texte apparaisse après la ligne 10, échangez simplement I pour A:

sed '3a\
Added text' file.txt

La façon la plus simple de se souvenir est de considérer « je » comme insérer avant et « a » en tant qu'ajout après.

Parfois, il est plus propre de remplacer une ligne entière au lieu de modifier des parties de celui-ci. Pour cela, utilisez l'option C. Par exemple, si vous avez un fichier de propriétés avec un numéro de version et que vous souhaitez le mettre à jour, vous pouvez remplacer toute la ligne:

sed '/^version=/c\version=2.0.0' config.conf

Cette commande supprime l'ancienne ligne et écrit votre nouveau à sa place.

Remplacement de la ligne spécifique à l'aide de la commande SED

Si vous souhaitez supprimer complètement une ligne sans rien ajouter de nouveau, utilisez l'option D:

sed '3d' file.txt

Cela supprime la ligne 3. De plus, vous pouvez également couper un bloc de lignes en spécifiant une plage comme celle-ci:

sed '5,10d' file.txt

Cela efface les lignes 5 à 10.

Tout comme plus tôt, lorsque nous avons utilisé la correspondance de modèles pour trouver et remplacer le contenu, nous pouvons également utiliser SED pour la suppression basée sur les modèles. Par exemple, si un fichier journal contient des milliers d'entrées de débogage, vous pouvez les supprimer tous en même temps:

sed '/DEBUG/d' logfile.txt

Ces commandes peuvent sembler intimidant au début, mais une fois que vous commencerez à les utiliser, vous effectuez rapidement ces opérations de base avec seulement quelques touches.

3

Affichage et extraction du contenu

Par défaut, SED imprime chaque ligne qu'il traite, ce qui peut être écrasant, en particulier avec les journaux ou les fichiers de configuration. Pour contrôler cela, nous utilisons l'option -N, qui dit à SED de rester silencieux, sauf si nous lui demandons explicitement de montrer quelque chose. L'association à la commande p (pour l'impression) nous donne un contrôle total sur ce qui apparaît.

Par exemple, pour imprimer la 5e ligne d'un fichier spécifié, utilisez:

sed -n '5p' file.txt
Impression uniquement la ligne spécifique du fichier texte

Vous pouvez également saisir des gammes de lignes spécifiques. Par exemple, pour imprimer les lignes 15 à 20, exécuter:

sed -n '15,20p' file.txt

De même, si vous recherchez un mot ou un modèle spécifique, comme des erreurs enterrées dans des milliers de lignes, utilisez ceci:

sed -n '/ERROR/p' file.txt

Ici, SED recherche n'importe quelle ligne contenant l'erreur du mot et imprime uniquement ces lignes. C'est comme exécuter Grep, mais directement à l'intérieur de SED, ce qui est pratique lorsque vous enchaînez plusieurs opérations ensemble.

Un autre cas d'utilisation puissant consiste à extraire des morceaux de texte entre deux marqueurs. Imaginez que vous déboguez un journal système et que vous ne souhaitez que la section entre le début et la fin:

sed -n '/START/,/END/p' file.txt

Cette commande agit comme un surligneur intelligent, retirant tout entre ces mots clés. Pour inverser le match, utilisez simplement le! option comme ceci:

sed -n '/ERROR/!p' logfile.txt

Cela imprime toutes les lignes à l'exception de celles contenant une erreur, vous permettant de vous concentrer sur la sortie propre et d'ignorer le bruit.

4

Modification des fichiers en place avec des options de sauvegarde

Tout ce que SED fait est sûr: il n'imprime que les résultats du terminal, tout en laissant vos fichiers d'origine intacts. Cependant, finalement, vous voudrez peut-être apporter des modifications permanentes. Avec l'option -i, vous pouvez modifier le fichier en place:

sed -i 's/old/new/g' file.txt

Cela remplace chaque instance de l'ancienne par la nouvelle directement dans votre fichier texte. Pas de redirection, pas de fichiers supplémentaires, juste une mise à jour instantanée. Mais voici la capture: cela écrase immédiatement le fichier, sans bouton d'annulation.

Pour créer une sauvegarde du fichier d'origine, utilisez -I avec un suffixe de sauvegarde:

sed -i.bak 's/old/new/g' file.txt

Maintenant, SED crée une copie de l'original en tant que fichier.txt.bak avant d'effectuer des modifications. Si quelque chose ne va pas, vous pouvez revenir rapidement. Vous pouvez même choisir des suffixes personnalisés:

sed -i.backup 's/temporary/permanent/g' file.txt
sed -i.$(date +%Y%m%d) 's/foo/bar/g' config.conf

La première commande crée file.txt.backup, tandis que la seconde fait une sauvegarde horodomagie, une astuce que j'utilise lors de l'itération des configurations, me permettant de tracer quelle version provenait du jour.

5

Appliquer plusieurs modifications à la fois

Parfois, un seul montage ne suffit pas. Vous pourriez nettoyer un ensemble de données, standardiser les étiquettes ou peaufiner un fichier de configuration où plusieurs modifications sont nécessaires. La course à pied fonctionne plusieurs fois, mais c'est inefficace. Au lieu de cela, vous pouvez regrouper les modifications, de sorte que le fichier n'est analysé qu'une seule fois.

Par exemple, pour effectuer deux remplacements en une seule réussite, utilisez plusieurs drapeaux E:

sed -i -e 's/apple/orange/g' -e 's/pear/grape/g' file.txt

Ici, la pomme devient orange et la poire devient de raisin. Pour un style plus compact, vous pouvez empiler des commandes dans une seule chaîne, séparée par des demi-colons:

sed 's/red/blue/g; s/apple/orange/g; /draft/d' data.txt

Cette version remplace les couleurs, échange les noms de fruits et supprime n'importe quelle ligne contenant le brouillon. Cela fonctionne de la même manière, mais à mesure que les modifications s'accumulent, la lisibilité souffre. C'est à ce moment que le déplacement des commandes dans un fichier de script dédié aide.

6

Automatiser les modifications avec des scripts

Si vous avez des tâches de nettoyage récurrentes, par exemple, un projet avec des centaines de fichiers contenant des erreurs de formatage mineures telles que des symboles supplémentaires, des termes incohérents ou des commentaires errants. C'est à ce moment que vous devez automatiser. Au lieu de coller des lignes dans votre terminal, enregistrez vos modifications dans un fichier de script et appliquez-les à tout texte dont vous avez besoin.

Par exemple, créer des modifications.

s/apple/orange/g
s/pear/grape/g
/^#/d

Maintenant, vous pouvez tout exécuter à la fois avec:

sed -i -f edits.sed file.txt

Avec une commande, SED applique toutes vos modifications en une seule réussite à votre fichier spécifié. Cependant, vous devrez passer un peu de temps à créer les règles de modification pour les fichiers que vous souhaitez modifier.

7

Modifier le texte en tirant parti des expressions régulières (regex)

Les expressions régulières (regex) décrivent des modèles au lieu du texte littéral. Cela signifie que vous pouvez cibler les formes de données, telles qu'un mot suivi d'un nombre ou d'un texte à la fin d'une ligne, plutôt que de mots exacts. À première vue, Regex a l'air intimidant, mais une fois que vous avez appris quelques bases, c'est comme avoir un couteau armée suisse pour la manipulation du texte.

Regex n'est pas seulement pour nettoyer le texte – il vous aide également à repérer les modèles et à façonner la façon dont vous travaillez avec les données. Certains symboles clés comprennent:

  • ^ et $ correspondent au texte au début ou à la fin d'une ligne.

  • Crochets comme [0-9] correspondre à n'importe quel chiffre, et [aeiouAEIOU] vous aider à trouver ou supprimer les voyelles.

  • Le point. représente un seul caractère.

  • * et + vous permettez de répéter des modèles autant de fois que vous en avez besoin.

Regex peut devenir assez profond, mais même l'apprentissage de quelques bases ouvre de nombreuses possibilités avec des outils comme SED.

Prenez cette commande, qui retourne les prénoms et les noms de famille:

sed -E 's/^([A-Za-z]+)[[:space:]]+([A-Za-z]+)$/\2, \1/' names.txt

Si votre fichier ressemble à ceci:

John Doe
Jane Smith

Ensuite, la sortie ressemblera à ceci:

Doe, John
Smith, Jane

Regex résout également des problèmes de cohérence, comme le rembourrage à un seul chiffre avec un zéro ou la suppression des espaces de fuite des journaux et des fichiers CSV:

sed -E 's/\b([0-9])\b/0\1/g' numbers.txt #add a leading zero
sed -E 's/[[:space:]]+$//' file.txt #removing trailing spaces

8

Nettoyage et formatage des fichiers texte

Les fichiers désordonnés apparaissent tout le temps, en particulier lorsqu'ils proviennent de Windows, Excel ou des exportations générées par automatiquement. SED nettoie rapidement ces données afin que vous puissiez lire, les partager ou les alimenter en scripts plus facilement.

Un exemple classique comprend les terminaisons de la ligne Windows. Si vous ouvrez un fichier Windows sur Linux et voyez des caractères errants ^ m, c'est le retour de transport \ r. Vous pouvez éliminer le retour de chariot supplémentaire à la fin de chaque ligne avec ceci:

sed -i 's/\r$//' file.txt

Les onglets sont une autre nuisance commune. Pour tout standardiser dans les espaces, vous pouvez utiliser ceci:

sed -E 's/\t/ /g' file.txt

En outre, les espaces blancs se glissent dans partout – lignes de fuite, espaces de fuite ou espacement incohérent entre les mots. SED le gère facilement avec ces commandes:

sed -E '/^[[:space:]]*$/d' file.txt 
sed -E 's/[[:space:]]+$//' file.txt
sed -E 's/[[:space:]]+/ /g' file.txt

Ici, la première commande nettoie les lignes vides, la seconde dépouille les espaces errants sur les bords, et le dernier comprime plusieurs espaces en un seul pour un texte soigné et uniforme.

9

Combiner avec d'autres commandes

Une autre chose que j'aime chez SED est sa capacité à travailler en douceur avec d'autres commandes bash. Il coupe la sortie, extrait les informations, compare les fichiers traités et les échelles modifiés sur de nombreux fichiers, le tout avec des doublures rapides ou à l'intérieur de scripts plus grands.

Par exemple, PS Aux imprime généralement plus que vous ne le souhaitez. Mais le tuyau dans SED ne tient que les cinq premières lignes:

ps aux | sed -n '1,5p'
Utilisation de SED avec PS Aux Commande pour obtenir une sortie limitée.

Vous pouvez également combiner Grep avec SED pour extraire des informations spécifiques. Par exemple, si vous avez un journal plein de messages d'erreur avec des horodatages entre crochets, utilisez-le pour extraire uniquement les horodatages:

grep 'ERROR' logfile | sed -E 's/.*\[([0-9-: ]+)\].*/\1/p'

Ce ne sont que quelques exemples. Vous pouvez combiner SED avec Diff, trouver, xargs et bien d'autres. Il remodèle des flux complexes de texte, de sorte que la commande suivante peut mieux faire son travail.


Des opérations simples et réinstallées aux transformations complexes alimentées par le regex, SED propose des solutions qui sauvent d'innombrables heures de travail manuel. Cependant, comme toute commande Linux, la clé pour la maîtriser est la pratique quotidienne. Utilisez-le souvent, et bientôt cela ressemblera à une seconde nature.



Vous pouvez lire l’article original (en Angais) sur le blogwww.howtogeek.com