Stream Editor - Recetas útiles

SED es una utilidad asombrosa que permite múltiples formas de resolver un problema. Esta es la forma UNIX y SED lo prueba perfectamente. GNU / Linux proporciona muchas utilidades útiles para realizar las tareas del día a día. Simulemos algunas utilidades usando SED. A veces puede parecer que estamos resolviendo un problema fácil de la manera difícil, pero el propósito es simplemente demostrar el poder de SED.

Comando de gato

En el siguiente ejemplo, cada línea se imprime como parte del flujo de trabajo predeterminado.

[jerry]$ sed '' books.txt

Al ejecutar el código anterior, obtiene el siguiente resultado:

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

El siguiente ejemplo utiliza el comando de impresión para mostrar el contenido del archivo.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

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

Eliminar líneas vacías

En el siguiente ejemplo, "^ $" implica una línea vacía y las líneas vacías se eliminan cuando una coincidencia de patrón tiene éxito.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

Line #1 
Line #2

De manera similar, el siguiente ejemplo imprime la línea solo cuando no está vacía.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

Line #1 
Line #2

Eliminar líneas comentadas de un programa C ++

Creemos un programa de muestra en C ++.

#include <iostream> 
using namespace std; 

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

Ahora elimine los comentarios usando la siguiente expresión regular.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

#include <iostream>
using namespace std; 

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

Agregar comentarios antes de ciertas líneas

El siguiente ejemplo agrega comentarios antes de los números de línea del 3 al 5.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

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

Comando wc -l

El comando "wc -l" cuenta el número de líneas presentes en el archivo. La siguiente expresión SED simula lo mismo.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

8

Comando principal

Por defecto, el comando head imprime las primeras 10 líneas del archivo. Simulemos el mismo comportamiento con SED.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

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 de cola -1

La "cola -1" imprime la última línea del archivo. La siguiente sintaxis muestra su simulación.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

Line #1 
Line #2

Escribamos el guión SED.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

Line #2

Comando Dos2unix

En el entorno DOS, una nueva línea está representada por una combinación de caracteres CR / LF. La siguiente simulación del comando "dos2unix" convierte un carácter de nueva línea de DOS en un carácter de nueva línea de UNIX. En GNU / Linux, este carácter a menudo se trata como el carácter "^ M" (Control M).

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

test.txt: ASCII text, with CRLF line terminators

Simulemos el 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

Al ejecutar el código anterior, obtiene el siguiente resultado:

new.txt: ASCII text

Ahora veamos el contenido del archivo.

[jerry]$ cat -vte new.txt

Al ejecutar el código anterior, obtiene el siguiente resultado:

Line #1$ 
Line #2$

Comando Unix2dos

Similar a "dos2unix", hay un comando "unix2dos" que convierte el carácter de nueva línea de UNIX en un carácter de nueva línea de DOS. El siguiente ejemplo muestra la simulación del mismo.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

test.txt: ASCII text

Simulemos el comando usando SED.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

new.txt: ASCII text, with CRLF line terminators

Ahora veamos el contenido del archivo.

Now let us display the file contents.

Al ejecutar el código anterior, obtiene el siguiente resultado:

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

Comando Cat -E

El comando "cat -E" muestra el final de la línea con el carácter de dólar ($). El siguiente ejemplo de SED es una simulación del mismo.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

Line #1$ 
Line #2$

Simulemos el comando usando SED.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

Line #1$ 
Line #2$

Comando Cat -ET

El comando "cat -ET" muestra el símbolo de dólar ($) al final de cada línea y muestra los caracteres TAB como "^ I". El siguiente ejemplo muestra la simulación del comando "cat -ET" usando SED.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

Line #1^ILine #2$

Simulemos el comando usando SED.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

Line #1^ILine #2$

nl comando

El comando "nl" simplemente numera las líneas de los archivos. El siguiente script SED simula este comportamiento.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

1 Line #1 
2 Line #2

La primera expresión SED imprime los números de línea seguidos de su contenido, y la segunda expresión SED fusiona estas dos líneas y convierte los caracteres de nueva línea en caracteres TAB.

Comando cp

El comando "cp" almacena otra copia del archivo. El siguiente script SED simula este comportamiento.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

0

Expandir comando

El comando "expandir" convierte los caracteres TAB en espacios en blanco. El siguiente código muestra su simulación.

[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 $?

Al ejecutar el código anterior, obtiene el siguiente resultado:

0

Comando Tee

El comando "tee" vuelca los datos en el flujo de salida estándar así como en el archivo. A continuación se muestra la simulación del comando "tee".

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

Simulemos el comando usando SED.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

Line #1 
Line #2

Comando cat -s

El comando "cat -s" de UNIX suprime las líneas de salida vacías repetidas. El siguiente código muestra la simulación 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

Al ejecutar el código anterior, obtiene el siguiente resultado:

Line #1  
Line #2
Line #3

Simulemos el comando usando SED.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

Line #1  
Line #2  
Line #3

comando grep

Por defecto, el comando "grep" imprime una línea cuando una coincidencia de patrón tiene éxito. El siguiente código muestra su simulación.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

Line #1

Simulemos el comando usando SED.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

Line #1

comando grep -v

Por defecto, el comando "grep -v" imprime una línea cuando falla una coincidencia de patrón. El siguiente código muestra su simulación.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

Line #2 
Line #3

Simulemos el comando usando SED.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

Line #2 
Line #3

tr comando

El comando "tr" traduce caracteres. A continuación se muestra su simulación.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

abc

Simulemos el comando usando SED.

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

abc