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