sed

Exemples de Bash Sed

Exemples de Bash Sed
Bash vous permet d'effectuer un remplacement de modèle en utilisant une expansion variable comme ($var/pattern/replacement). Et donc, sed comme ça (sed -e 's/pattern/replacement/'). Cependant, il y a plus à sed que de remplacer des motifs dans des fichiers texte.  Ici, nous allons redécouvrir sed, par exemple, avec des commandes et des workflows équivalents pour faciliter les tâches quotidiennes.

Configuration pour les exemples sed

Voici un guide rapide pour se mettre en place pour l'exemple, que je vais essayer de ne pas trop exagérer.

"mots" est un fichier texte contenant les nombres 1 à 100. Si vous n'êtes pas sûr de la commande pour la créer, voir Fonction d'exportation pour xargs dans la commande d'exportation Bash. Vous ne savez jamais que ce sera peut-être lors de votre prochaine interview de script shell.

"bar" est un fichier texte contenant une seule ligne -.

"old-php" est un fichier texte contenant des lignes de l'ancien PHP qui se cassera dans php7 ou plus tard. (Indice : ereg)

Notez que toutes les fonctions décrites ci-dessus peuvent être trouvées ci-dessous dans la note de fin sur les fonctions de configuration.

Exemples Sed avec des commandes équivalentes

Dans un environnement de ligne de commande, vous découvrirez qu'il existe plusieurs solutions pour une tâche donnée. Cependant, pour la plupart, vous voulez aller avec le chemin qui donne le moins de résistance. Voici une liste d'exemples de commandes sed avec les commandes équivalentes correspondantes, où certaines seront couvertes en détail ci-dessous.

1. Imprimer une ligne aléatoire (équivalent à sort -R - | head -1)

sed -n "$(( ALÉATOIRE % 100 ))p" -

2.Imprimer la dernière ligne du fichier (équivalent à head -1 -)

sed -n '$p' -

3. Imprimer les 10 premières lignes d'un fichier (équivalent à head -n 10 -)

sed '10q' -

4. Imprimer la première ligne d'un fichier (équivalent à la queue -1 -)

sed -n '1p' -

5. Supprimer toutes les instances d'un caractère (équivalent à tr -delete '0' -, où 0 est le caractère que nous voulons supprimer)

sed -e 's/0//g' -

6. Convertir le fichier csv en tsv (équivalent à tr ',"\t' -)

sed -e 's/,/\t/g' -

7.Ajouter une ligne au fichier (équivalent à une barre de chat -)

sed '$a ---' -

8. Ajouter la ligne au fichier (équivalent à cat - bar)

sed '1i ---' -

9. Imprimez toutes les lignes du fichier (équivalent à cat -)

sed -n -e 'p' -

dix. Imprimer une ligne correspondant à un motif (équivalent à grep -e '^1' -)

sed -n -e '/^1/ p' -

11. Supprimer les lignes correspondant à un motif (équivalent à grep -v -e '^1' -)

sed -e '/^1/ d' -

12. Récupère le nombre de lignes dans un fichier (équivalent à wc -l -)

sed -n -e '$=' -

13. Écrire dans un fichier en arrière-plan (commande équivalente tee)

sed "w $1" -

Exemple d'utilisation de sed pour implémenter la commande tee

Juste au-dessus, il y a un exemple intitulé Écrire dans un fichier en arrière-plan. Un peu comme la commande tee. Et bien ça l'est. Ici, nous allons expliquer comment implémenter une fonction pour remplacer tee dans bash en utilisant sed.

Commandes

tee ()

test $# -eq 1 || revenir;
sed "w $1" -

principale ()

séquence 10 | tee dix;
chat dix

principale

Production

1
2
3
4
5
6
7
8
9
dix
1
2
3
4
5
6
7
8
9
dix

Ici, vous verrez deux listes des nombres entiers de 1 à 10. Le premier vient de la commande seq. La seconde que nous obtenons du chat du fichier écrit en tee. je sais c'est ridicule mais ca marche!

Exemple d'utilisation de sed pour imprimer une ligne aléatoire dans un fichier

Supposons que nous voulions imprimer une ligne aléatoire dans un fichier en utilisant bash et un peu de sed. Pouvons-nous le faire? Oui nous pouvons! Voici comment.

Implémenter une fonction qui

  1. Obtient le nombre de lignes dans un fichier, L
  2. Génère un nombre aléatoire entre 1 et L, R
  3. Impressions R

La fonction s'attend à ce que l'entrée soit acheminée de l'extérieur.

Commandes

une ligne ()

fonction lc ()

sed -n -e '$=' -
 ;
fonction ligne d'impression ()

sed -n -e "$1p" -
 ;
temp=$( mktemp );
chat - > $temp ;
chat $temp | ligne d'impression $(( RANDOM % $( cat $temp | lc ) + 1 ));
rm $temp

Exemple d'utilisation (1)

séquence 100 | _

Sortie (1)

35

Exemple d'utilisation (2)

boucle https://linuxhint.com/bash_cut_command/ --silent | bandes-étiquettes | une ligne

Voir l'exemple ci-dessous, utilisant sed pour supprimer les balises HTML. Notez que l'exemple over renvoie parfois un blanc pour les lignes vides. Comme exercice, il peut être amélioré.

Utiliser sed pour imprimer des lignes dans un fichier

Supposons que vous vouliez implémenter une fonction dans bash pour imprimer une ligne donnée dans un fichier. Essayer d'imprimer une seule ligne dans un fichier en utilisant une boucle dans bash, head, tail ou awk est trop de travail pour imprimer des lignes dans un fichier. Heureusement que nous avons sed. La fonction résultante utilisant sed serait la suivante.

Commandes

ligne d'impression ()

sed -n "$1p" -

Voyons maintenant ce qui se passe lorsque nous utilisons la ligne d'impression sur les mots.

Commandes

mots | ligne d'impression 50

Production

50

D'accord. Ça a l'air bien mais essayons quelque chose qui a l'air un peu moins trivial.

Commandes

déclarer -xf mots
déclarer -xf ligne d'impression
seq 1 10 $( mots | wc -l ) | xargs -i  bash -c "mots | ligne d'impression "

Production

1
11
21
31
41
51
61
71
81
91

D'accord. Maintenant c'est plus comme ça! Vous voyez comment sed peut être utilisé dans un script bash pour imprimer n'importe quelle ligne d'un fichier.

Exemples Sed sans commandes équivalentes

Dans un environnement de ligne de commande, parfois le chemin vers une solution produisant le moins de résistance est la voie sed ; sinon, vous finissez par faire plus de travail que nécessaire en premier lieu. Certaines commandes peuvent être présentées ci-dessous.

Commande toutes les lignes dans un script shell

sed -e 's/^/#/' -
Supprimer la première ligne
sed -e '1d' -
Supprimer la dernière ligne
sed -e '$ d' -
Insérer une ligne avant les lignes correspondant à un motif
sed '/0$/i ---' -
Insérer une ligne après les lignes correspondant à un motif
sed '/0$/ ---' -
Supprimer les balises html
sed -e 's/<[^>]*.//g' -
Mettre à niveau ereg dans l'ancien code php pour l'exécuter dans php7 ou version ultérieure
sed 's/ereg(\([^,]*\).\([^)]*\)./strpos(\2,\1)/g'
Vérifiez si sed est antérieur à une certaine version
sed -e 'v 4.5' -

Exemple de branchement de version sed dans bash

Ci-dessus dans les exemples, il y a une ligne pour vérifier si sed est antérieure à une certaine version que nous pouvons utiliser pour implémenter le branchement de version dans bash, ce qui, je pense, est plus facile que d'essayer d'implémenter une fonction pour comparer les numéros de version à partir de la sortie sed -version. Ce seul écueil est que s'il existe une version antérieure de sed qui ne prend pas en charge la commande v, alors nous sommes en difficulté.

Commandes

test-sed-version-at-most()
écho -n | sed "v $1" - 2>/dev/null

essayer-version ()

echo -n "Version $1. D'accord. Faites-le le ";
test-sed-version-at-most $1 &&
echo -n "ancien" ;
vrai
||
echo -n "nouveau"
 ;
echo " chemin."

principale ()

local v;
pour v en 4.4,5 ;
fais
version d'essai $v ;
Fini

principale

Production

Version 4.4. D'accord. Faites-le à l'ancienne.
Version 4.5. D'accord. Faites-le de la nouvelle façon.

Notez que la version de sed s'exécutant sur ma machine au moment de la saisie de ces caractères est 4.4, ce qui expliquerait la sortie ci-dessus. De plus, en même temps, la dernière version de gnu sed était 4.7, environ 3 ans de plus que celui que j'ai. Mon sed est vieux! En fait, au sed 4.0.6, un paramètre a été ajouté à la commande de version afin que cette stratégie fonctionne pour tout dit au moins v4.0.6, ce qui est clément étant donné que la version est sortie début 2003. Vous êtes bon.

J'ai fait quelques recherches supplémentaires, en fait des NOUVELLES en lisant le dernier code source. Version 4.6 a une nouvelle fonctionnalité, -debug qui vide le script et annote les lignes de sortie. Cela vous permettrait de traduire les scripts sed générés par les fonctions de bash en forme canonique. Frais! N'oubliez pas que vous avez besoin d'une branche de version sed dans bash. C'est là que cet exemple sed entre en jeu.

Exemple de fonction bash utilisant sed pour supprimer les balises HTML

Dans les exemples ci-dessus, il y a une ligne pour supprimer les balises HTML. Jetons cela dans une fonction bash et utilisons-la pour supprimer toutes les balises HTML du dernier article que j'ai écrit.

Commandes

bandes-étiquettes ()

sed -e 's/<[^>]*.//g' -

boucle https://linuxhint.com/bash_cut_command/ --silent | bandes-étiquettes

Je ne peux pas dire que c'est parfait mais au moins c'est lisible dans le terminal.

Exemples de sed avec workflows : exemple de workflow : remplacez tout en toute sécurité à l'aide de find, grep et sed

Il est sûr de dire que les modifications apportées à l'aide de sed avec l'option -i sont irréversibles. C'est à moins que vous ne soyez complètement sûr du texte à remplacer, vous risquez de vous retrouver avec un caractère de moins que prévu. C'est pourquoi dans cet exemple, nous utiliserons sed dans un workflow pour remplacer en toute sécurité le texte dans tous les fichiers que vous avez sélectionnés.

Flux de travail

  1. trouve
  2. grep
  3. sed
trouve

Ici, vous sélectionnerez les fichiers à remplacer. Je suggère d'utiliser une commande comme suit :

find -type f -name | grep -v -e | xargs -i …

Par exemple, vous souhaiterez peut-être limiter les fichiers pour remplacer les fichiers PHP à l'exclusion des répertoires du référentiel git comme suit.

find -type f -name \*.php | grep -v -e '.git' | xargs -je…

En savoir plus sur la commande xargs dans bash.

grep

Ensuite, nous allons essayer de faire correspondre some_pattern dans les fichiers sélectionnés comme suit. Notez que puisque nous utilisons l'option -o pour grep, la sortie n'affichera que la chaîne correspondante, le cas échéant.

find -type f -name \*.php | grep -v -e '.git' |
xargs -i grep -e un_motif -o

La commande ci-dessus doit renvoyer une liste de chaînes correspondant à some_pattern.

sed

Enfin, nous voulons remplacer toutes les chaînes correspondant à some_pattern. Pour ce faire, nous devons convertir grep en sed comme suit.

find -type f -name \*.php | grep -v -e '.git' |
xargs -i sed -i -e s/un_motif/remplacement/g

La commande grep devient sed -i et l'option -o est supprimée. Et voila.

Maintenant, vous pouvez vérifier au préalable quelles chaînes vont être remplacées dans sed au lieu de tenter votre chance.

Notes sur les options utilisées dans les exemples

Voici une liste des options utilisées dans les exemples sed discutés brièvement.

Option La description
-je Modifier sur place. Si l'entrée est un fichier (non redirigé), le résultat des expressions écrasera le contenu du fichier.

Sed en accepte un

par exemple) sed -n…

-e -e signifie expression. Son paramètre est une expression dans le langage sed.

Sed accepte de nombreux

par exemple) sed -e 'expr1' -e 'expr2'…

-m Cache la ligne non affectée par l'expression. C'est-à-dire que si l'expression est une instruction print dans le langage sed, les lignes non incluses dans l'instruction print ne seront pas incluses dans la sortie.

par exemple) sed -n…

Pour plus d'informations sur les options sed disponibles, consultez sed -help

Notes de fin sur les commandes équivalentes utilisées dans les exemples

Les utilitaires de ligne de commande suivants sont inclus dans les exemples sed avec des commandes équivalentes.

Note de fin - dans l'exemple de commandes équivalentes

Au cas où vous vous demanderiez ce qui se passe sur le caractère - dans l'exemple, cette note est pour vous. J'ai ajouté un caractère - après la plupart des commandes dans les exemples pour indiquer que nous nous attendons à ce que l'entrée soit reçue via un tube. C'est-à-dire,

chat quelque-fichier | trier -R - | tête -1

Cependant, lorsque la commande à gauche du tuyau est présente, nous pouvons omettre l'indice comme suit.

chat quelque-fichier | trier -R | tête -1

C'est ce qui se passait avec le caractère - après les commandes dans les exemples.

Notes sur les fonctions de configuration

Au cas où vous chercheriez, voici des fonctions pour la configuration des exemples ci-dessus. La sortie obtenue en utilisant declare -f. En savoir plus sur la commande declare dans bash pour plus d'utilisations.

Commandes

mots ()

séquence 100

bar ()

écho ---

ancien-php ()

echo 'ereg($UA,"Bottybot")'

En bout de ligne

J'ai aimé écrire des exemples de Bash sed et j'ai même découvert quelques astuces supplémentaires en cours de route. Sed est un puissant utilitaire de ligne de commande et un langage expressif pour manipuler des fichiers texte. Si vous avez aimé en savoir plus sur sed, ne vous inquiétez pas, il reste encore beaucoup à toucher. Sed sur.

Meilleurs jeux de ligne de commande pour Linux
La ligne de commande n'est pas seulement votre plus grand allié lorsque vous utilisez Linux, elle peut également être une source de divertissement car...
Meilleures applications de mappage de manette de jeu pour Linux
Si vous aimez jouer à des jeux sur Linux avec une manette de jeu au lieu d'un système de saisie clavier et souris typique, il existe des applications ...
Outils utiles pour les joueurs Linux
Si vous aimez jouer à des jeux sur Linux, il est probable que vous ayez utilisé des applications et des utilitaires comme Wine, Lutris et OBS Studio p...