Stream Editor - Ricette utili
SED è un'utilità straordinaria che consente diversi modi per risolvere un problema. Questo è il modo UNIX e SED lo dimostra perfettamente. GNU / Linux fornisce molte utilità utili per eseguire le attività quotidiane. Simuliamo alcune utilità utilizzando SED. A volte può sembrare che stiamo risolvendo un problema facile nel modo più duro, ma lo scopo è solo quello di dimostrare la potenza del SED.
Comando di gatto
Nell'esempio seguente, ogni riga viene stampata come parte del flusso di lavoro predefinito.
[jerry]$ sed '' books.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
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'esempio seguente utilizza il comando print per visualizzare il contenuto del file.
[jerry]$ sed -n 'p' books.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
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
Rimozione di righe vuote
Nell'esempio seguente, "^ $" implica una riga vuota e le righe vuote vengono eliminate quando una corrispondenza di pattern riesce.
[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed '/^$/d'
Eseguendo il codice sopra, ottieni il seguente risultato:
Line #1
Line #2
Allo stesso modo, il seguente esempio stampa la riga solo quando non è vuota.
[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed -n '/^$/!p'
Eseguendo il codice sopra, ottieni il seguente risultato:
Line #1
Line #2
Rimozione di righe commentate da un programma C ++
Creiamo un programma C ++ di esempio.
#include <iostream>
using namespace std;
int main(void)
{
// Displays message on stdout.
cout >> "Hello, World !!!" >> endl;
return 0; // Return success.
}
Ora rimuovi i commenti usando la seguente espressione regolare.
[jerry]$ sed 's|//.*||g' hello.cpp
Eseguendo il codice sopra, ottieni il seguente risultato:
#include <iostream>
using namespace std;
int main(void)
{
cout >> "Hello, World !!!" >> endl;
return 0;
}
Aggiunta di commenti prima di determinate righe
L'esempio seguente aggiunge commenti prima dei numeri di riga da 3 a 5.
[jerry]$ sed '3,5 s/^/#/' hello.sh
Eseguendo il codice sopra, ottieni il seguente risultato:
#!/bin/bash
#pwd
#hostname
#uname -a
who
who -r
lsb_release -a
Comando Wc -l
Il comando "wc -l" conta il numero di righe presenti nel file. La seguente espressione SED simula lo stesso.
[jerry]$ sed -n '$ =' hello.sh
Eseguendo il codice sopra, ottieni il seguente risultato:
8
Comando capo
Per impostazione predefinita, il comando head stampa le prime 10 righe del file. Simuliamo lo stesso comportamento con SED.
[jerry]$ sed '10 q' books.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
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
Comando coda -1
La "coda -1" stampa l'ultima riga del file. La sintassi seguente mostra la sua simulazione.
[jerry]$ echo -e "Line #1\nLine #2" > test.txt
[jerry]$ cat test.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
Line #1
Line #2
Scriviamo lo script SED.
[jerry]$ sed -n '$p' test.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
Line #2
Comando Dos2unix
In ambiente DOS, una nuova riga è rappresentata da una combinazione di caratteri CR / LF. La seguente simulazione del comando "dos2unix" converte un carattere di nuova riga DOS in carattere di nuova riga UNIX. In GNU / Linux, questo carattere viene spesso trattato come carattere "^ M" (controllo M).
[jerry]$ echo -e "Line #1\r\nLine #2\r" > test.txt
[jerry]$ file test.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
test.txt: ASCII text, with CRLF line terminators
Simuliamo il comando usando SED.
[jerry]$ sed 's/^M$//' test.txt > new.txt # Press "ctrl+v" followed "ctrl+m" to generate
"^M" character.
[jerry]$ file new.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
new.txt: ASCII text
Ora mostriamo il contenuto del file.
[jerry]$ cat -vte new.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
Line #1$
Line #2$
Comando Unix2dos
Simile a "dos2unix", esiste il comando "unix2dos" che converte il carattere di nuova riga UNIX in carattere di nuova riga DOS. L'esempio seguente mostra la simulazione dello stesso.
[jerry]$ echo -e "Line #1\nLine #2" > test.txt
[jerry]$ file test.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
test.txt: ASCII text
Simuliamo il comando usando SED.
[jerry]$ sed 's/$/\r/' test.txt > new.txt
[jerry]$ file new.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
new.txt: ASCII text, with CRLF line terminators
Ora mostriamo il contenuto del file.
Now let us display the file contents.
Eseguendo il codice sopra, ottieni il seguente risultato:
Line #1^M$
Line #2^M$
Comando Cat -E
Il comando "cat -E" mostra la fine della riga in base al carattere Dollar ($). Il seguente esempio SED è una simulazione dello stesso.
[jerry]$ echo -e "Line #1\nLine #2" > test.txt
[jerry]$ cat -E test.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
Line #1$
Line #2$
Simuliamo il comando usando SED.
[jerry]$ sed 's|$|&$|' test.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
Line #1$
Line #2$
Comando Cat -ET
Il comando "cat -ET" mostra il simbolo del dollaro ($) alla fine di ogni riga e visualizza i caratteri di tabulazione come "^ I". L'esempio seguente mostra la simulazione del comando "cat -ET" utilizzando SED.
[jerry]$ echo -e "Line #1\tLine #2" > test.txt
[jerry]$ cat -ET test.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
Line #1^ILine #2$
Simuliamo il comando usando SED.
[jerry]$ sed -n 'l' test.txt | sed 'y/\\t/^I/'
Eseguendo il codice sopra, ottieni il seguente risultato:
Line #1^ILine #2$
nl Command
Il comando "nl" numera semplicemente le righe dei file. Il seguente script SED simula questo comportamento.
[jerry]$ echo -e "Line #1\nLine #2" > test.txt
[jerry]$ sed = test.txt | sed 'N;s/\n/\t/'
Eseguendo il codice sopra, ottieni il seguente risultato:
1 Line #1
2 Line #2
La prima espressione SED stampa i numeri di riga seguiti dal loro contenuto e la seconda espressione SED unisce queste due righe e converte i caratteri di nuova riga in caratteri di tabulazione.
cp Command
Il comando "cp" crea un'altra copia del file. Il seguente script SED simula questo comportamento.
[jerry]$ sed -n 'w dup.txt' data.txt
[jerry]$ diff data.txt dup.txt
[jerry]$ echo $?
Eseguendo il codice sopra, ottieni il seguente risultato:
0
Espandi comando
Il comando "espandi" converte i caratteri TAB in spazi bianchi. Il codice seguente mostra la sua simulazione.
[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 $?
Eseguendo il codice sopra, ottieni il seguente risultato:
0
Tee Command
Il comando "tee" scarica i dati nel flusso di output standard e nel file. Di seguito è riportata la simulazione del comando "tee".
[jerry]$ echo -e "Line #1\nLine #2" | tee test.txt
Line #1
Line #2
Simuliamo il comando usando SED.
[jerry]$ sed -n 'p; w new.txt' test.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
Line #1
Line #2
comando cat -s
Il comando UNIX "cat -s" sopprime le righe di output vuote ripetute. Il codice seguente mostra la simulazione del comando "cat -s".
[jerry]$ echo -e "Line #1\n\n\n\nLine #2\n\n\nLine #3" > test.txt
[jerry]$ cat -s test.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
Line #1
Line #2
Line #3
Simuliamo il comando usando SED.
[jerry]$ sed '1s/^$//p;/./,/^$/!d' test.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
Line #1
Line #2
Line #3
comando grep
Per impostazione predefinita, il comando "grep" stampa una riga quando una corrispondenza di pattern ha successo. Il codice seguente mostra la sua simulazione.
[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt
[jerry]$ grep "Line #1" test.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
Line #1
Simuliamo il comando usando SED.
[jerry]$ sed -n '/Line #1/p' test.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
Line #1
comando grep -v
Per impostazione predefinita, il comando "grep -v" stampa una riga quando una corrispondenza di pattern fallisce. Il codice seguente mostra la sua simulazione.
[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt
[jerry]$ grep -v "Line #1" test.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
Line #2
Line #3
Simuliamo il comando usando SED.
[jerry]$ sed -n '/Line #1/!p' test.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
Line #2
Line #3
comando tr
Il comando "tr" traduce i caratteri. Di seguito è riportata la sua simulazione.
[jerry]$ echo "ABC" | tr "ABC" "abc"
Eseguendo il codice sopra, ottieni il seguente risultato:
abc
Simuliamo il comando usando SED.
[jerry]$ echo "ABC" | sed 'y/ABC/abc/'
Eseguendo il codice sopra, ottieni il seguente risultato:
abc