Stream Editor: comandos básicos

Este capítulo describe varios comandos SED útiles.

Eliminar comando

SED proporciona varios comandos para manipular texto. Exploremos primero sobre eldeletemando. Así es como se ejecuta un comando de eliminación:

[address1[,address2]]d

address1 y address2son las direcciones inicial y final respectivamente, que pueden ser números de línea o cadenas de patrones. Ambas direcciones son parámetros opcionales.

Como sugiere el nombre, el comando de eliminación se usa para realizar la operación de eliminación y dado que el SED opera en línea, podemos decir que este comando se usa para eliminar líneas. Tenga en cuenta que el comando de eliminación elimina las líneas solo del búfer de patrones; la línea no se envía al flujo de salida y el archivo original permanece sin cambios. El siguiente ejemplo ilustra el punto.

[jerry]$ sed 'd' books.txt

Pero, ¿dónde está la salida? Si no se proporciona una dirección de línea, el SED funciona en todas las líneas de forma predeterminada. Por lo tanto, elimina todas las líneas del búfer de patrones. Es por eso que el comando no imprime nada en la salida estándar.

Indiquemos al SED que opere solo en ciertas líneas. El siguiente ejemplo elimina solo la cuarta línea.

[jerry]$ sed '4d' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

Además, SED también acepta el rango de direcciones con coma (,). Podemos indicarle al SED que elimine las líneas N1 a N2. Por ejemplo, el siguiente ejemplo elimina todas las líneas de la 2 a la 4.

[jerry]$ sed '2, 4 d' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

El rango de direcciones de SED no se limita solo a números. También podemos especificar patrones como una dirección. El siguiente ejemplo elimina todos los libros del autor Paulo Coelho.

[jerry]$ sed '/Paulo Coelho/d' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
6) A Game of Thrones, George R. R. Martin, 864

También podemos especificar un rango de direcciones usando un patrón textual. El siguiente ejemplo elimina todas las líneas entre los patrones.Storm y Fellowship.

[jerry]$ sed '/Storm/,/Fellowship/d' books.txt  
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

Además de esto, también podemos usar los operadores dólar ($), más (+) y tilde (~) con SED.

Comando de escritura

Una de las operaciones importantes que realizamos sobre cualquier archivo es la copia de seguridad, es decir, hacemos otra copia del archivo. SED proporcionawritecomando para almacenar el contenido del búfer de patrones en un archivo. A continuación se muestra la sintaxis de lawrite comando que es similar al delete mando.

[address1[,address2]]w file

Aquí, address1 y address2son la dirección inicial y final respectivamente, que pueden ser números de línea o cadenas de patrones. Ambas direcciones son parámetros opcionales.

En la sintaxis anterior, w se refiere al comando de escritura y filees el nombre del archivo en el que almacena el contenido. Tenga cuidado con elfileparámetro. Cuando se proporciona un nombre de archivo, el SED crea un archivo sobre la marcha si no está presente y lo sobrescribe si ya está presente.

Hagamos una copia exacta del archivo usando SED. Tenga en cuenta que debe haber exactamente un espacio entrew y file.

[jerry]$ sed -n 'w books.bak' books.txt

Creamos otro archivo llamado books.bak. Ahora verifique que ambos archivos tengan el mismo contenido.

[jerry]$ diff books.txt books.bak  
[jerry]$ echo $?

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

0

Puede asumir que el cpcomando hace exactamente lo mismo. ¡Si! loscpEl comando hace lo mismo, pero SED es una utilidad madura. Permite crear un archivo que contiene solo ciertas líneas del archivo fuente. Guardemos solo líneas pares en otro archivo.

[jerry]$ sed -n '2~2 w junk.txt' books.txt  
[jerry]$ cat junk.txt

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

2) The Two Towers, J. R. R. Tolkien, 352 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
6) A Game of Thrones, George R. R. Martin, 864

También puede usar los operadores de coma (,), dólar ($) y más (+) con el comando de escritura.

Además de esto, SED también admite la coincidencia de patrones con el comando de escritura. Suponga que desea almacenar todos los libros de autores individuales en un archivo separado. Una forma aburrida y prolongada es hacerlo manualmente, y la forma más inteligente es usar SED.

[jerry]$ sed -n -e '/Martin/ w Martin.txt' -e '/Paulo/ w Paulo.txt' -e '/Tolkien/ w 
Tolkien.txt' books.txt

En el ejemplo anterior, comparamos cada línea con un patrón y almacenamos la línea coincidente en un archivo en particular. Es muy simple. Para especificar varios comandos, usamos-einterruptor del comando SED. Ahora veamos qué contiene cada archivo:

[jerry]$ cat Martin.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
6) A Game of Thrones, George R. R. Martin, 864

Visualicemos el contenido del archivo.

[jerry]$ cat Paulo.txt

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

3) The Alchemist, Paulo Coelho, 197 
5) The Pilgrimage, Paulo Coelho, 288

Visualicemos el contenido del archivo.

[jerry]$ cat Tolkien.txt

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

2) The Two Towers, J. R. R. Tolkien, 352 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432

¡Excelente! Obtuvimos el resultado esperado. SED es realmente una utilidad asombrosa.

Agregar comando

Una de las operaciones más útiles de cualquier editor de texto es proporcionar funcionalidad de adición. SED admite esta operación mediante su comando append. A continuación se muestra la sintaxis de append:

[address]a\ 
Append text

Agreguemos una nueva entrada de libro después de la línea número 4. El siguiente ejemplo muestra cómo hacerlo

[jerry]$ sed '4 a 7) Adultry, Paulo Coelho, 234' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
7) Adultry, Paulo Coelho, 234 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

En la sección de comandos, 4 implica el número de línea, a es el comando append y la parte restante es el texto que se agregará.

Insertemos una línea de texto al final del archivo. Para hacer esto, use$como la dirección. El siguiente ejemplo lo ilustra:

[jerry]$ sed '$ a 7) Adultry, Paulo Coelho, 234' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864 
7) Adultry, Paulo Coelho, 234

Además del número de línea, también podemos especificar una dirección utilizando un patrón textual. Por ejemplo, el siguiente ejemplo agrega texto después de hacer coincidir la cadenaThe Alchemist.

[jerry]$ sed '/The Alchemist/ a 7) Adultry, Paulo Coelho, 234' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
7) Adultry, Paulo Coelho, 234 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

Tenga en cuenta que si hay varios patrones que coinciden, el texto se agrega después de cada coincidencia. El siguiente ejemplo ilustra este escenario.

[jerry]$ sed '/The/ a 7) Adultry, Paulo Coelho, 234' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
7) Adultry, Paulo Coelho, 234 
3) The Alchemist, Paulo Coelho, 197 
7) Adultry, Paulo Coelho, 234 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
7) Adultry, Paulo Coelho, 234 
5) The Pilgrimage, Paulo Coelho, 288 
7) Adultry, Paulo Coelho, 234 
6) A Game of Thrones, George R. R. Martin, 864

Cambiar comando

SED proporciona change o replacecomando que está representado por c. Este comando ayuda a reemplazar una línea existente con texto nuevo. Cuando se proporciona un rango de línea, todas las líneas se reemplazan como un grupo por una sola línea de texto. A continuación se muestra la sintaxis del comando de cambio:

[address1[,address2]]c\ 
Replace text

Reemplacemos la tercera línea con algún otro texto.

[jerry]$ sed '3 c 3) Adultry, Paulo Coelho, 324' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) Adultry, Paulo Coelho, 324 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

SED también acepta patrones como dirección. En el siguiente ejemplo, una línea se reemplaza cuando la coincidencia del patrón se realiza correctamente.

[jerry]$ sed '/The Alchemist/ c 3) Adultry, Paulo Coelho, 324' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) Adultry, Paulo Coelho, 324 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

SED también permite el reemplazo de varias líneas con una sola línea. El siguiente ejemplo elimina las líneas de la cuarta a la sexta y las reemplaza con texto nuevo.

[jerry]$ sed '4, 6 c 4) Adultry, Paulo Coelho, 324' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) Adultry, Paulo Coelho, 324

Insertar comando

El comando insert funciona de la misma manera que append. La única diferencia es que inserta una línea antes de una posición específica. A continuación se muestra la sintaxis del comando de inserción:

[address]i\ 
Insert text

Entendamos el comando insert con algunos ejemplos. El siguiente comando inserta una nueva entrada antes de la cuarta línea.

[jerry]$ sed '4 i 7) Adultry, Paulo Coelho, 324' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
7) Adultry, Paulo Coelho, 324 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

En el ejemplo anterior, 4 es el número de ubicación, i implica el comando de inserción, y la parte restante es el texto a insertar.

Para insertar texto al comienzo de un archivo, proporcione la dirección de línea como 1. El siguiente comando ilustra esto:

[jerry]$ sed '1 i 7) Adultry, Paulo Coelho, 324' books.txt

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

7) Adultry, Paulo Coelho, 324
1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

Además, podemos insertar varias líneas. El siguiente comando inserta dos líneas antes de la última línea.

[jerry]$ sed '$ i 7) Adultry, Paulo Coelho, 324

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

8) Eleven Minutes, Paulo Coelho, 304' books.txt 
1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage,Paulo Coelho, 288 
7) Adultry, Paulo Coelho, 324 
8) Eleven Minutes, Paulo Coelho, 304 
6) A Game of Thrones, George R. R. Martin, 864

Tenga en cuenta que las entradas que se van a insertar se introducen en líneas separadas y delimitadas por el carácter de barra invertida (\).

Traducir comando

SED proporciona un comando para traducir caracteres y se representa como y. Transforma a los personajes por posición. A continuación se muestra la sintaxis del comando de traducción:

[address1[,address2]]y/list-1/list-2/

Tenga en cuenta que la traducción se basa en la posición del personaje de list 1 al personaje en la misma posición en list 2y ambas listas deben ser listas de caracteres explícitas. Las expresiones regulares y las clases de caracteres no son compatibles. Además, el tamaño delist 1 y list 2 debe ser el mismo.

El siguiente ejemplo convierte números arábigos en números romanos.

[jerry]$ echo "1 5 15 20" | sed 'y/151520/IVXVXX/'

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

I V IV XX

yo mando

¿Puede diferenciar entre palabras separadas por espacios y palabras separadas por caracteres de tabulación con solo mirarlas? Ciertamente no. Pero SED puede hacer esto por usted. SED utiliza ellcomando para mostrar caracteres ocultos en el texto. Por ejemplo, carácter de tabulación con\t y fin de línea con $personaje. A continuación se muestra la sintaxis de lal mando.

[address1[,address2]]l 
[address1[,address2]]l [len]

Creemos un archivo con caracteres de tabulación para demostración. Para simplificar, usaremos el mismo archivo, simplemente reemplazando espacios con tabulaciones. ¡Espere! Pero, ¿cómo hacerlo, abriendo el archivo en un editor de texto y reemplazando cada espacio con una pestaña? ¡Ciertamente no! Podemos hacer uso de los comandos SED para eso.

[jerry]$ sed 's/ /\t/g' books.txt > junk.txt

Ahora mostremos los caracteres ocultos usando el l mando:

[jerry]$ sed -n 'l' junk.txt

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

1)\tA\tStorm\tof\tSwords,George\tR.\tR.\tMartin,1216$ 
2)\tThe\tTwo\tTowers,J.\tR.\tR.\tTolkien,352$ 
3)\tThe\tAlchemist,Paulo\tCoelho,197$ 
4)\tThe\tFellowship\tof\tthe\tRing,J.\tR.\tR.\tTolkien,432$ 
5)\tThe\tPilgrimage,Paulo\tCoelho,288$ 
6)\tA\tGame\tof\tThrones,George\tR.\tR.\tMartin\t,864$

Como otros comandos SED, también acepta números de línea y patrones como dirección. Pueden probarlo ustedes mismos.

Echemos un vistazo de cerca a otra característica interesante de SED. Podemos indicarle al SED que realice un ajuste de línea después de un cierto número de caracteres. El siguiente ejemplo ajusta las líneas después de 25 caracteres.

[jerry]$ sed -n 'l 25' books.txt

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

1) A Storm of Swords,Geo\ 
rge R. R. Martin,1216$ 
2) The Two Towers,J. R. \ 
R. Tolkien,352$ 
3) The Alchemist,Paulo C\ 
oelho,197$ 
4) The Fellowship of the\ 
 Ring,J. R. R. Tolkien,4\ 
32$ 
5) The Pilgrimage,Paulo \ 
Coelho,288$ 
6) A Game of Thrones,Geo\ 
rge R. R. Martin ,864$

Tenga en cuenta que en el ejemplo anterior, el límite de ajuste se proporciona después del comando l. En este caso, son 25 caracteres. Esta opción es específica de GNU y es posible que no funcione con otras variantes del SED.

Un límite de ajuste de 0 significa nunca romper la línea a menos que haya un carácter de nueva línea. El siguiente comando simple ilustra esto.

[jerry]$ sed -n 'l 0' books.txt

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

1) A Storm of Swords,George R. R. Martin,1216$ 
2) The Two Towers,J. R. R. Tolkien,352$ 
3) The Alchemist,Paulo Coelho,197$ 
4) The Fellowship of the Ring,J. R. R. Tolkien,432$ 
5) The Pilgrimage,Paulo Coelho,288$ 
6) A Game of Thrones,George R. R. Martin,864$

Salir del comando

El comando Quit indica al SED que abandone el flujo de ejecución actual. Está representado por elqmando. A continuación se muestra la sintaxis del comando quit:

[address]q 
[address]q [value]

Tenga en cuenta que el comando quit no acepta un rango de direcciones, solo admite una única dirección. De forma predeterminada, SED sigue el flujo de trabajo de lectura, ejecución y repetición; pero cuando se encuentra el comando quit, simplemente detiene la ejecución actual.

Imprimamos las primeras 3 líneas del archivo.

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

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197

Además del número de línea, también podemos usar patrones textuales. El siguiente comando se cierra cuando el patrón coincide con éxito.

[jerry]$ sed '/The Alchemist/ q' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197

Además de esto, SED también puede aceptar un valueque se puede utilizar como estado de salida. El siguiente comando muestra su estado de salida como 100.

[jerry]$ sed '/The Alchemist/ q 100' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197

Ahora verifiquemos el estado de salida.

[jerry]$ echo $?

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

100

Leer comando

Podemos indicarle al SED que lea el contenido de un archivo y lo muestre cuando coincida una condición específica. El comando está representado por el alfabeto.r. A continuación se muestra la sintaxis del comando de lectura.

[address]r file

Tenga en cuenta que debe haber exactamente un espacio entre r comando y el nombre del archivo.

Entendamos con un simple ejemplo. Crea un archivo de muestra llamadojunk.txt.

[jerry]$ echo "This is junk text." > junk.txt

El siguiente comando indica al SED que lea el contenido de junk.txt e insértelos después de la tercera línea.

[jerry]$ sed '3 r junk.txt' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
This is junk text. 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

En el ejemplo anterior, 3 implica la dirección de línea, r es el nombre del comando, y junk.txtes el nombre del archivo cuyo contenido se mostrará. Además, GNU SED también acepta un rango de direcciones. Por ejemplo, el siguiente comando inserta el contenido dejunk.txt después de la tercera, cuarta y quinta líneas.

[jerry]$ sed '3, 5 r junk.txt' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
This is junk text. 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
This is junk text. 
5) The Pilgrimage, Paulo Coelho, 288 
This is junk text. 
6) A Game of Thrones, George R. R. Martin, 864

Al igual que otros comandos SED, el comando de lectura también acepta un patrón como dirección. Por ejemplo, el siguiente comando inserta el contenido dejunk.txt cuando la coincidencia de patrones tiene éxito.

[jerry]$ sed '/Paulo/ r junk.txt' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
This is junk text. 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
This is junk text. 
6) A Game of Thrones, George R. R. Martin, 864

Ejecutar comando

Podemos ejecutar comandos externos desde SED usando el executemando. Está representado pore. A continuación se muestra la sintaxis del comando de ejecución.

[address1[,address2]]e [command]

Ilustremos el comando de ejecución con un ejemplo simple. El siguiente comando SED ejecuta UNIXdate comando antes de la tercera línea.

[jerry]$ sed '3 e date' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
Sun Sep  7 18:04:49 IST 2014 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

Como otros comandos, también acepta patrones como dirección. Por ejemplo, el siguiente ejemplo ejecutadatecomando cuando una coincidencia de patrones tiene éxito. Tenga en cuenta que después de cada coincidencia de patrón, primero se ejecuta el comando y luego se muestra el contenido del búfer de patrón.

[jerry]$ sed '/Paulo/ e date' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
Sun Sep  7 18:06:04 IST 2014 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
Sun Sep  7 18:06:04 IST 2014 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

Si observa la sintaxis del e comando con cuidado, notará que commandes opcional. Cuando no se proporciona ningún comando despuése,trata el contenido del búfer de patrones como un comando externo. Para ilustrar esto, creemos un archivo commands.txt con algunos comandos simples.

[jerry]$ echo -e "date\ncal\nuname" > commands.txt 
[jerry]$ cat commands.txt

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

date 
cal 
uname

Los comandos del archivo se explican por sí mismos. En ausencia decommand después e,SED ejecuta todos estos comandos uno por uno. El siguiente ejemplo simple ilustra esto.

[jerry]$ sed 'e' commands.txt

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

Sun Sep  7 18:14:20 IST 2014 
   September 2014      
Su Mo Tu We Th Fr Sa   
    1  2  3  4  5  6   
 7  8  9 10 11 12 13   
14 15 16 17 18 19 20   
21 22 23 24 25 26 27   
28 29 30               
                       
Linux

Como otros comandos SED, el comando de ejecución también acepta todos los rangos válidos de direcciones.

Comandos varios

De forma predeterminada, SED opera en una sola línea, sin embargo, también puede operar en varias líneas. Los comandos de varias líneas se indican con letras mayúsculas. Por ejemplo, a diferencia deln comando, el NEl comando no borra e imprime el espacio del patrón. En su lugar, agrega una nueva línea (\ n) al final del espacio del patrón actual y agrega la siguiente línea del archivo de entrada al espacio del patrón actual y continúa con el flujo estándar del SED ejecutando el resto de los comandos del SED. A continuación se muestra la sintaxis de laN mando.

[address1[,address2]]N

Imprimamos una lista separada por comas de títulos de libros y sus respectivos autores. El siguiente ejemplo lo ilustra.

[jerry]$ sed 'N; s/\n/, /g' 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

Entendamos cómo funciona el ejemplo anterior. losNEl comando lee la primera línea, es decir, A Storm of Swords en el búfer de patrones y agrega \ n seguido de la siguiente línea. El espacio del patrón ahora contiene Una tormenta de espadas\nGeorge RR Martin. En el siguiente paso, reemplazaremos la nueva línea con una coma.

Me gusta p comando, tenemos un P comando para imprimir la primera parte (hasta la nueva línea incrustada) del espacio de patrón de varias líneas creado por el Nmando. A continuación se muestra la sintaxis de laP comando que es similar al p mando.

[address1[,address2]]P

En el ejemplo anterior, vimos que el NEl comando crea una lista separada por líneas nuevas de títulos de libros y sus autores. Imprimamos solo la primera parte, es decir, solo los títulos del libro. El siguiente comando ilustra esto.

[jerry]$ sed -n 'N;P' books.txt

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

A Storm of Swords 
The Two Towers 
The Alchemist 
The Fellowship of the Ring 
The Pilgrimage 
A Game of Thrones

Tenga en cuenta que en ausencia de N, se comporta igual que el pmando. El siguiente comando simple ilustra este escenario.

[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

Además de esto, SED también proporciona un vcomando que comprueba la versión. Si la versión proporcionada es mayor que la versión SED instalada, la ejecución del comando falla. Tenga en cuenta que esta opción es específica de GNU y es posible que no funcione con otras variantes de SED. A continuación se muestra la sintaxis de lav mando.

[address1[,address2]]v [version]

Primero, averigüe la versión actual de SED.

[jerry]$ sed --version

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

sed (GNU sed) 4.2.2

En el siguiente ejemplo, la versión SED es mayor que la versión 4.2.2, por lo que el comando SED aborta su ejecución.

[jerry]$ sed 'v 4.2.3' books.txt

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

sed: -e expression #1, char 7: expected newer version of sed

Pero si la versión proporcionada es menor o igual que la versión 4.2.2, entonces el comando funciona como se esperaba.

[jerry]$ sed 'v 4.2.2' 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