Articles

Bash Sed Examples

Bash vous permet d’effectuer un remplacement de motif en utilisant l’expansion de variable comme (${var/pattern/replacement}). Et il en est de même pour sed comme ceci (sed -e ‘s/pattern/replacement/’). Cependant, sed ne se limite pas à remplacer des motifs dans des fichiers texte. Ici, nous allons redécouvrir sed, par l’exemple, avec des commandes équivalentes et des flux de travail pour faciliter les tâches quotidiennes.

Mise en place des exemples sed

Voici un guide rapide pour se mettre en place pour l’exemple, que j’essaierai de ne pas rendre trop surchargé.

« mots » est un fichier texte contenant les chiffres de 1 à 100. Si vous n’êtes pas sûr de la commande pour le créer, voir Export function for xargs dans Bash Export Command. On ne sait jamais, il pourrait figurer dans votre prochain entretien sur les scripts 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 briseront dans php7 ou plus. (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 pour la configuration.

Exemples avec des commandes équivalentes

Dans un environnement de ligne de commande, vous trouverez qu’il y a plus d’une solution à une tâche donnée. Cependant, dans la plupart des cas, vous souhaitez emprunter le chemin qui offre 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 « $(( RANDOM % 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 à tail -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 à cat bar -)

sed ‘$a —‘ –

8. Ajouter une ligne au fichier (équivalent à cat – bar)

sed ‘1i —‘ –

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

sed -n -e ‘p’ –

10. Imprimer une lignes 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. Obtenir le nombre de lignes dans un fichier (équivalent à wc -l -)

sed -n -e ‘$=’ –

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

sed « w ${1} » –

Exemple utilisant sed pour implémenter la commande tee

Du haut, il y a un exemple intitulé Ecrire dans un fichier en arrière-plan. Cela ressemble un peu à la commande tee. Eh bien, c’est le cas. Ici, nous allons développer comment mettre en œuvre une fonction pour remplacer tee dans bash en utilisant sed.

Commandes

tee ()
{
test ${#} -eq 1 || return;
sed « w ${1} » –
}
main ()
{
seq 10 | tee ten ;
cat ten
}
main

Sortie

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

.

Vous verrez ici deux listings des entiers de 1 à 10. La première provient de la commande seq. La seconde nous vient du cat du fichier écrit en tee. Je sais que c’est ridicule mais ça marche !

Exemple utilisant 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. Est-ce que nous pouvons le faire ? Oui, nous le pouvons ! Voici comment.

Implémenter une fonction qui

  1. Reçoit le nombre de lignes dans un fichier, L
  2. Génère un nombre aléatoire entre 1 et L, R
  3. Imprime R

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

Commandes

some-line ()
{
fonction lc ()
{
sed -n -e ‘$=’ –
} ;
function print-line ()
{
sed -n -e « ${1}p » –
};
temp=$( mktemp );
cat – > ${temp};
cat ${temp} | print-line $(( RANDOM % $( cat ${temp} | lc ) + 1 ));
rm ${temp}
}

Exemple d’utilisation (1)

seq 100 | _

Sortie (1)

35

Exemple d’utilisation (2)

curl https://linuxhint.com/bash_cut_command/ -.-silent | strip-tags | some-line

Voir l’exemple ci-dessous, utilisant sed pour enlever les balises HTML. Notez que l’exemple over renvoie parfois des blancs pour les lignes vides. En tant qu’exercice, il peut être amélioré.

Utilisation de 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

print-line ()
{
sed -n « ${1}p » –
}.

Voyons maintenant ce qui se passe lorsque nous utilisons print-line sur des mots.

Commandes

words | print-line 50

Sortie

50

OK. Ça a l’air bien mais essayons quelque chose qui a l’air un peu moins trivial.

Commandes

declare -xf words
declare -xf print-line
seq 1 10 $( words | wc -l ) | xargs -i bash -c « words | print-line {} ».

Sortie

1
11
21
31
41
51
61
71
81
91

Ok. Maintenant, c’est mieux comme ça ! Vous voyez comment sed peut être utilisé dans un script bash pour imprimer n’importe quelle ligne d’un fichier.

Exemples de sed sans commandes équivalentes

Dans un environnement de ligne de commande, parfois le chemin vers une solution offrant 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.

Commander toutes les lignes d’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’ –
Mise à jour de l’ereg dans l’ancien code php pour qu’il fonctionne avec php7 ou une version ultérieure
sed ‘s/ereg(\(*\).\(*\)./strpos(\2,\1)/g’
Vérifier si sed est antérieur à une certaine version
sed -e ‘v 4.5’ –

Exemple de branchement de version sed en bash

Haut dans les exemples, il y a une ligne pour Vérifier si sed est antérieur à une certaine version que nous pouvons utiliser pour implémenter le branchement de version en 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 supporte pas la commande v, alors nous sommes en difficulté.

Commandes

test-sed-version-at-most() {
echo -n | sed « v ${1} » – 2>/dev/null
}
try-version ()
{
echo -n « Version ${1}. Ok. Faites le « ;
test-sed-version-au-moins ${1}. && {
echo -n « old »;
true
} || {
echo -n « new »
};
echo  » way. »
}
main ()
{
local v;
for v in 4.{4,5};
do
try-version ${v};
done
}
main

Output

Version 4.4. Ok. Faites-le à l’ancienne.
Version 4.5. Ok. Faites-le de la nouvelle façon.

Notez que la version de sed qui tourne sur ma machine au moment de taper ces caractères est 4.4, ce qui expliquerait la sortie ci-dessus. De plus, au même moment, la dernière version de gnu sed était 4.7, soit environ 3 ans de plus que celle que j’ai. Mon sed est vieux ! En fait, dans sed 4.0.6, un paramètre a été ajouté à la commande version, de sorte que cette stratégie fonctionne pour tout dit au moins v4.0.6, ce qui est indulgent compte tenu du fait que cette version a été publiée au début de 2003. Vous êtes bon.

J’ai fait quelques recherches supplémentaires, en fait NOUVELLE lecture hors du dernier code source. La version 4.6 a une nouvelle fonctionnalité, -debug qui dump 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. Cool ! Mais n’oubliez pas que vous avez besoin du branchement de la version de sed dans bash. C’est là que cet exemple sed entre en jeu.

Exemple de fonction bash utilisant sed pour dépouiller les balises HTML

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

Commandes

strip-tags ()
{
sed -e ‘s/<*.//g’ –
}
curl https://linuxhint.com/bash_cut_command/ –silent | strip-tags

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

Sed exemples avec des workflows : Exemple de flux de travail : remplacer tout en toute sécurité en utilisant find, grep et sed

Il est sûr de dire que les changements effectués en utilisant sed avec l’option -i sont irréversibles. C’est-à-dire qu’à moins d’être complètement sûr du texte à remplacer, vous êtes susceptible de vous retrouver avec un caractère de moins que prévu. C’est pourquoi dans cet exemple, nous utiliserons sed dans un flux de travail pour remplacer en toute sécurité le texte dans tous les fichiers que vous avez sélectionnés.

Flux de travail

  1. find
  2. grep
  3. sed
find

Ici, vous allez sélectionner les fichiers à soumettre au remplacement. Je suggère d’utiliser une commande de ce type :

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

Par exemple, vous pouvez vouloir limiter les fichiers à remplacer aux fichiers PHP excluant les répertoires de dépôts git comme suit .

find -type f -name \*.php | grep -v -e ‘.git’ | xargs -i …

Lire plus sur la commande xargs en bash.

grep

Puis, nous allons essayer de faire correspondre un certain_motif dans les fichiers sélectionnés comme suit. Notez que puisque nous utilisons l’option -o pour grep, la sortie ne montrera que la chaîne de caractères correspondante s’il y en a une.

find -type f -name \*.php | grep -v -e ‘.git’ |
xargs -i grep -e some_pattern -o

La commande ci-dessus devrait retourner une liste de chaîne correspondant à some_pattern.

sed

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

find -type f -name \*.php | grep -v -e ‘.git’ |
xargs -i sed -i -e s/some_pattern/replacement/g

La commande grep devient sed -i et l’option -o est supprimée. Et voilà.

Maintenant, vous pouvez vérifier à l’avance quelles chaînes de caractères vont être remplacées dans sed au lieu de tester votre chance.

Notes de fin sur les options utilisées dans les exemples

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

Option Description
-i Editer en place. Si l’entrée est un fichier (non pipé), le résultat des expressions écrasera le contenu du fichier.

Sed accepte un

eg) sed -n …

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

Sed accepte plusieurs

eg) sed -e ‘expr1′ -e ‘expr2’ …

-n Masque la ligne non affectée par l’expression. C’est-à-dire que si l’expression est une instruction d’impression dans le langage sed, alors les lignes non incluses dans l’instruction d’impression ne seront pas incluses dans la sortie.

Pour en savoir plus sur les options sed disponibles, voir sed -help

Notes de fin sur l’utilisation des commandes équivalentes dans les exemples

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

  • sort
  • head
  • tail
  • grep
  • cat
  • Tr
  • tee

Note de fin sur le – de fin dans les commandes équivalentes des exemples

Au cas où vous vous demanderiez ce qui se passe avec 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 attendons que l’entrée soit reçue par un tuyau. C’est-à-dire,

cat some-file | sort -R – | head -1

Toutefois, lorsque la commande à main gauche du pipe est présente, nous pouvons omettre l’indication comme suit .

cat some-file | sort -R | head -1

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

Notes finales sur les fonctions de la configuration

Au cas où vous chercheriez, voici les fonctions de la configuration pour les exemples ci-dessus. La sortie obtenue en utilisant declare -f. Lisez plus sur la commande declare dans bash pour plus d’utilisations.

Commandes

words ()
{
seq 100
}
bar ()
{
echo —
}
old-php ()
{
echo ‘ereg($UA, « Bottybot »)’
}

Ligne de fond

J’ai pris plaisir à écrire les exemples de Bash sed et j’ai même appris quelques astuces supplémentaires en cours de route. Sed est un utilitaire de ligne de commande puissant et un langage expressif pour manipuler les fichiers texte. Si vous avez aimé apprendre sur sed, ne vous inquiétez pas, il y a encore beaucoup de choses à toucher. Sed on.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *