É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