Éditeur de flux - Recettes utiles

SED est un utilitaire étonnant qui permet de multiples façons de résoudre un problème. C'est la méthode UNIX et SED le prouve parfaitement. GNU / Linux fournit de nombreux utilitaires utiles pour effectuer des tâches quotidiennes. Simulons quelques utilitaires en utilisant SED. Parfois, il peut sembler que nous résolvons un problème facile à la dure, mais le but est simplement de démontrer la puissance du SED.

Commande de chat

Dans l'exemple suivant, chaque ligne est imprimée dans le cadre du workflow par défaut.

[jerry]$ sed '' books.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

A Storm of Swords, George R. R. Martin 
The Two Towers, J. R. R. Tolkien 
The Alchemist, Paulo Coelho 
The Fellowship of the Ring, J. R. R. Tolkien 
The Pilgrimage, Paulo Coelho 
A Game of Thrones, George R. R. Martin

L'exemple suivant utilise la commande d'impression pour afficher le contenu du fichier.

[jerry]$ sed -n 'p' books.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

A Storm of Swords, George R. R. Martin 
The Two Towers, J. R. R. Tolkien 
The Alchemist, Paulo Coelho 
The Fellowship of the Ring, J. R. R. Tolkien 
The Pilgrimage, Paulo Coelho 
A Game of Thrones, George R. R. Martin

Suppression des lignes vides

Dans l'exemple suivant, "^ $" implique une ligne vide et les lignes vides sont supprimées lorsqu'une correspondance de modèle réussit.

[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed '/^$/d'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Line #1 
Line #2

De même, l'exemple suivant imprime la ligne uniquement lorsqu'elle n'est pas vide.

[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed -n '/^$/!p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Line #1 
Line #2

Suppression des lignes commentées d'un programme C ++

Créons un exemple de programme C ++.

#include <iostream> 
using namespace std; 

int main(void) 
{ 
   // Displays message on stdout. 
   cout >> "Hello, World !!!" >> endl;  
   return 0; // Return success. 
}

Supprimez maintenant les commentaires à l'aide de l'expression régulière suivante.

[jerry]$ sed 's|//.*||g' hello.cpp

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

#include <iostream>
using namespace std; 

int main(void) 
{ 
   cout >> "Hello, World !!!" >> endl; 
   return 0;  
}

Ajout de commentaires avant certaines lignes

L'exemple suivant ajoute des commentaires avant les numéros de ligne 3 à 5.

[jerry]$ sed '3,5 s/^/#/' hello.sh

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

#!/bin/bash 
#pwd 
#hostname 
#uname -a 
who 
who -r 
lsb_release -a

Commande wc -l

La commande "wc -l" compte le nombre de lignes présentes dans le fichier. L'expression SED suivante simule la même chose.

[jerry]$ sed -n '$ =' hello.sh

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

8

Commandement de la tête

Par défaut, la commande head imprime les 10 premières lignes du fichier. Simulons le même comportement avec SED.

[jerry]$ sed '10 q' books.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

A Storm of Swords 
George R. R. Martin 
The Two Towers 
J. R. R. Tolkien 
The Alchemist 
Paulo Coelho 
The Fellowship of the Ring 
J. R. R. Tolkien 
The Pilgrimage
Paulo Coelho

Commande Tail -1

Le "tail -1" imprime la dernière ligne du fichier. La syntaxe suivante montre sa simulation.

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ cat test.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Line #1 
Line #2

Écrivons le script SED.

[jerry]$ sed -n '$p' test.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Line #2

Commande Dos2unix

Dans un environnement DOS, une nouvelle ligne est représentée par une combinaison de caractères CR / LF. La simulation suivante de la commande "dos2unix" convertit un caractère de nouvelle ligne DOS en caractère de nouvelle ligne UNIX. Dans GNU / Linux, ce caractère est souvent traité comme le caractère "^ M" (Control M).

[jerry]$ echo -e "Line #1\r\nLine #2\r" > test.txt 
[jerry]$ file test.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

test.txt: ASCII text, with CRLF line terminators

Simulons la commande en utilisant SED.

[jerry]$ sed 's/^M$//' test.txt > new.txt   # Press "ctrl+v" followed "ctrl+m" to generate 
"^M" character. 
[jerry]$ file new.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

new.txt: ASCII text

Maintenant, affichons le contenu du fichier.

[jerry]$ cat -vte new.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Line #1$ 
Line #2$

Commande Unix2dos

Similaire à "dos2unix", il existe une commande "unix2dos" qui convertit le caractère de nouvelle ligne UNIX en caractère de nouvelle ligne DOS. L'exemple suivant montre la simulation de la même chose.

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ file test.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

test.txt: ASCII text

Simulons la commande en utilisant SED.

[jerry]$ sed 's/$/\r/' test.txt  > new.txt 
[jerry]$ file new.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

new.txt: ASCII text, with CRLF line terminators

Maintenant, affichons le contenu du fichier.

Now let us display the file contents.

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Line #1^M$ 
Line #2^M$

Commande Cat -E

La commande "cat -E" affiche la fin de la ligne par le caractère Dollar ($). L'exemple SED suivant est une simulation de la même chose.

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ cat -E test.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Line #1$ 
Line #2$

Simulons la commande en utilisant SED.

[jerry]$ sed 's|$|&$|' test.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Line #1$ 
Line #2$

Commande Cat -ET

La commande "cat -ET" affiche le symbole Dollar ($) à la fin de chaque ligne et affiche les caractères TAB sous la forme "^ I". L'exemple suivant montre la simulation de la commande "cat -ET" à l'aide de SED.

[jerry]$ echo -e "Line #1\tLine #2" > test.txt 
[jerry]$ cat -ET test.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Line #1^ILine #2$

Simulons la commande en utilisant SED.

[jerry]$ sed -n 'l' test.txt | sed 'y/\\t/^I/'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Line #1^ILine #2$

Commande nl

La commande "nl" numérote simplement les lignes des fichiers. Le script SED suivant simule ce comportement.

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ sed = test.txt | sed 'N;s/\n/\t/'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

1 Line #1 
2 Line #2

La première expression SED imprime les numéros de ligne suivis de leur contenu et la seconde expression SED fusionne ces deux lignes et convertit les caractères de nouvelle ligne en caractères TAB.

Commande cp

La commande "cp" crée une autre copie du fichier. Le script SED suivant simule ce comportement.

[jerry]$ sed -n 'w dup.txt' data.txt 
[jerry]$ diff data.txt dup.txt 
[jerry]$ echo $?

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

0

Agrandir la commande

La commande «expand» convertit les caractères TAB en espaces. Le code suivant montre sa simulation.

[jerry]$ echo -e "One\tTwo\tThree" > test.txt 
[jerry]$ expand test.txt > expand.txt 
[jerry]$ sed 's/\t/     /g' test.txt > new.txt 
[jerry]$ diff new.txt expand.txt  
[jerry]$ echo $?

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

0

Commande Tee

La commande "tee" vide les données dans le flux de sortie standard ainsi que dans le fichier. Ci-dessous, la simulation de la commande "tee".

[jerry]$ echo -e "Line #1\nLine #2" | tee test.txt  
Line #1 
Line #2

Simulons la commande en utilisant SED.

[jerry]$ sed -n 'p; w new.txt' test.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Line #1 
Line #2

Commande cat -s

La commande UNIX "cat -s" supprime les lignes de sortie vides répétées. Le code suivant montre la simulation de la commande "cat -s".

[jerry]$ echo -e "Line #1\n\n\n\nLine #2\n\n\nLine #3" > test.txt  
[jerry]$ cat -s test.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Line #1  
Line #2
Line #3

Simulons la commande en utilisant SED.

[jerry]$ sed '1s/^$//p;/./,/^$/!d' test.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Line #1  
Line #2  
Line #3

Commande grep

Par défaut, la commande "grep" imprime une ligne lorsqu'une correspondance de modèle réussit. Le code suivant montre sa simulation.

[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt  
[jerry]$ grep "Line #1" test.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Line #1

Simulons la commande en utilisant SED.

[jerry]$ sed -n '/Line #1/p' test.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Line #1

Commande grep -v

Par défaut, la commande "grep -v" imprime une ligne lorsqu'une correspondance de modèle échoue. Le code suivant montre sa simulation.

[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt  
[jerry]$ grep -v "Line #1" test.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Line #2 
Line #3

Simulons la commande en utilisant SED.

[jerry]$ sed -n '/Line #1/!p' test.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Line #2 
Line #3

Commande tr

La commande "tr" traduit les caractères. Ci-dessous est sa simulation.

[jerry]$ echo "ABC" | tr "ABC" "abc"

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

abc

Simulons la commande en utilisant SED.

[jerry]$ echo "ABC" | sed 'y/ABC/abc/'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

abc