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