Cómo usar el comando sed en Linux

Ventana de terminal en el sistema Linux.

Tal vez sea una locura, pero Linux sed la línea de comando es un editor de texto sin interfaz. Puede usarlo desde la línea de comando para manipular texto en archivos y transmisiones. Le mostraremos cómo usar su poder.

Poder de la sed

Un sed el comando es un poco como el ajedrez: se necesita una hora para aprender los conceptos básicos y el ciclo de vida para dominarlos (o al menos mucha práctica). Te mostraremos una selección de tácticas iniciales en cada una de las categorías principales sed funcionalidad.

sed es un editor de flujo que funciona en archivos de texto o de entrada de canalización. Sin embargo, no tiene una interfaz de editor de texto interactivo. En su lugar, dé instrucciones a seguir a medida que avanza el texto. Todos estos funcionan en Bash y otros shells de línea de comando.

Le sed puede hacer todo lo siguiente:

  • Elegir texto
  • Texto de reemplazo
  • Agregar líneas al texto
  • Eliminar líneas en el texto
  • Editar (o guardar) el archivo original

Estructuramos nuestros ejemplos para presentar e ilustrar conceptos, sin producir los más concisos (y más asequibles). sed pedidos. Sin embargo, las funciones de hacer coincidir patrones y seleccionar texto sed se basa en gran medida en expresiones regulares (gobierna). Necesitará un poco de conocimiento para obtener los mejores resultados. sed.

RELACIONADO: Cómo usar expresiones regulares (regexes) en Linux

Un simple ejemplo

Primero, usaremos echo enviar un mensaje de texto sed a través de una tubería y si sed reemplazar parte del texto. Para hacer esto, presentamos lo siguiente:

echo howtogonk | sed 's/gonk/geek/'

Un echo envía el comando «howtogonk» a sedy nuestra regla de representación simple («s» significa sustitución). sed busca que aparezca la primera cadena en el texto de entrada y reemplazará la segunda con cualquier coincidencia.

El cable «gonk» se reemplaza por un «geek» y el nuevo cable se imprime en la ventana del terminal.

Probablemente el uso más común es el reemplazo. sed. Sin embargo, antes de ocuparnos de la sustitución, debemos aprender a seleccionar y unir el texto.

Selección de texto

Necesitaremos un archivo de texto para nuestros ejemplos. Usaremos uno con una selección de letras del poema épico de Samuel Taylor Coleridge «The Rime of the Ancient Mariner».

Te presentamos lo siguiente para darte un vistazo less:

less coleridge.txt

Para seleccionar varias líneas en el archivo, proporcionamos las líneas inicial y final del rango que queremos seleccionar. Un número selecciona esa línea.

Para eliminar las líneas uno a cuatro, ingrese el siguiente comando:

sed -n '1,4p' coleridge.txt

Tenga en cuenta la coma en el medio 1 y 4. Un p «imprimir líneas apropiadas». Implícitamente, sed imprime cada línea. Vería todo el texto en el archivo con las líneas apropiadas impresas dos veces. Para evitar esto, usaremos -n opción (silencioso) para eliminar texto inapropiado.

Cambiamos los números de línea para poder elegir un verso diferente, como se muestra a continuación:

sed -n '6,9p' coleridge.txt

Nosotros podemos usar -e hacer una opción múltiple (expresión). Con dos oraciones, podemos elegir dos versos de la siguiente manera:

sed -n -e '1,4p' -e '31,34p' coleridge.txt

Si reducimos el primer número a la segunda expresión, podemos agregar espacio libre entre los dos versículos. Introducimos lo siguiente:

sed -n -e '1,4p' -e '30,34p' coleridge.txt

Podemos elegir y decir primera línea sed desplácese por el archivo e imprima líneas alternas, saltando cada quinta línea o saltando cualquier número de líneas. El comando es similar a los que usamos anteriormente para seleccionar un rango. Esta vez, sin embargo, usaremos tilde (~) en lugar de una coma para separar los números.

El primer número indica la línea de partida. El segundo número dice sed ¿Cuáles son las líneas después de la línea de salida que queremos ver? El número 2 significa cada segunda línea, 3 significa cada tercera línea y así sucesivamente.

Introducimos lo siguiente:

sed -n '1~2p' coleridge.txt

No siempre sabrá dónde está el texto que está buscando en el archivo, lo que significa que los números de línea no siempre serán muy útiles. Sin embargo, puede utilizar y sed seleccione líneas con patrones de texto apropiados. Por ejemplo, dibujemos todas las líneas que comiencen con «Y».

El carro (^) representa el comienzo de la línea. Incluiremos nuestro término de búsqueda con barra inclinada (/). También incluimos un espacio después de «Y» para que palabras como «Android» no se incluyan en el resultado.

LEER sed las escrituras pueden ser un poco sombrías al principio. Un /p significa «imprimir», tal como lo hizo en los comandos que usé anteriormente. Sin embargo, en el siguiente comando, está precedido por una barra:

sed -n '/^And /p' coleridge.txt

Tres líneas que comienzan con «Y» se eliminan del archivo y se nos muestran.

Reemplazar

En nuestro primer ejemplo, le mostramos el siguiente formato básico sed sustitución:

echo howtogonk | sed 's/gonk/geek/'

Un s decir sed este reemplazo. La primera cadena es el patrón de búsqueda y la segunda es el texto que queremos reemplazar ese texto. Por supuesto, como con todo Linux, el diablo está en los detalles.

Introducimos lo siguiente para cambiar cada evento de «día» a «semana» y para dar más tiempo al marinero y al albatros:

sed -n 's/day/week/p' coleridge.txt

En la primera línea, solo se cambia la segunda aparición del «día». Eso es porque sed se detiene después del primer juego en la línea. Necesitamos agregar «g» al final de la oración, como se muestra a continuación, para hacer una búsqueda global de modo que se procesen todos los juegos en cada línea:

sed -n 's/day/week/gp' coleridge.txt

Esto coincide con tres de cuatro en la primera línea. Porque la primera palabra es «Día» y sed distingue entre mayúsculas y minúsculas, no considera que ese caso sea lo mismo que «día».

Introducimos lo siguiente, agregando un i al comando al final de la oración para indicar la insensibilidad de un caso:

sed -n 's/day/week/gip' coleridge.txt

Esto funciona, pero es posible que no siempre desee cambiar la intolerancia al queso. En estos casos, puede usar un grupo de expresiones regex para agregar insensibilidad específica a cada caso.

Por ejemplo, si incluimos caracteres entre corchetes ([]), se muestran como «cualquier carácter de esta lista de caracteres».

Ingrese lo siguiente e incluya «D» y «d» en el grupo para asegurarse de que coincida con «Día» y «día»:

sed -n 's/[Dd]ay/week/gp' coleridge.txt

También podemos restringir las representaciones a partes del archivo. Supongamos que el primer verso de nuestro archivo tiene un espaciado extraño. Podemos usar el siguiente comando familiar para ver el primer versículo:

sed -n '1,4p' coleridge.txt

Examinaremos dos espacios y los reemplazaremos por uno. Haremos esto en todo el mundo para que la acción se repita. Para ser claros, el patrón de búsqueda es espacio, espacio de asterisco (*), y la cadena de representación es un solo espacio. Un 1,4 restringe el reemplazo a las primeras cuatro filas del archivo.

Juntamos todo esto en el siguiente orden:

sed -n '1,4 s/  */ /gp' coleridge.txt

¡Esto funciona maravillosamente! El patrón de búsqueda es importante aquí. Asterisco ()*) es igual a cero o más del carácter anterior, que es un espacio. Por tanto, el patrón de búsqueda busca una cadena de uno o más espacios.

Si reemplazamos cualquier secuencia de múltiples espacios con un solo espacio, regresamos el archivo al espacio normal, con un espacio entre cada palabra. Esto reemplazará un espacio con un espacio en algunos casos, pero esto no tendrá ningún efecto negativo; aún obtendremos el resultado deseado.

Si vamos a lo siguiente y reducimos el patrón de búsqueda a un espacio, verá inmediatamente por qué necesitamos incluir dos espacios:

sed -n '1,4 s/ */ /gp' coleridge.txt

Como el asterisco coincide con cero o más la mayor parte del carácter anterior, ve todos los caracteres que no son espacios como «espacio cero» y aplica su reemplazo.

Sin embargo, si tenemos dos espacios en el patrón de búsqueda, sed un personaje debe adquirir al menos un espacio antes de que se aplique el reemplazo. Esto asegura que los caracteres no espaciales permanezcan intactos.

Introducimos lo siguiente, usando -e (expresión) que usamos anteriormente, que nos permite hacer dos o más sustituciones al mismo tiempo:

sed -n -e 's/motion/flutter/gip' -e 's/ocean/gutter/gip' coleridge.txt

Podemos obtener el mismo resultado si usamos un semiconductor (;) separan las dos oraciones, de la siguiente manera:

sed -n 's/motion/flutter/gip;s/ocean/gutter/gip' coleridge.txt

Cuando cambié «día» a «semana» en el siguiente comando, se cambió un «día» de ejemplo de la frase «bien un día»:

sed -n 's/[Dd]ay/week/gp' coleridge.txt

Para evitarlo, solo podemos probar nuevas líneas que se ajusten a otro modelo. Si cambiamos el orden en el que tenemos un patrón de búsqueda al principio, solo consideraremos trabajar en líneas que coincidan con ese patrón.

Introducimos lo siguiente para hacer la palabra «después» de nuestro patrón de coincidencia:

sed -n '/after/ s/[Dd]ay/week/gp' coleridge.txt

Eso nos da la respuesta que necesitamos.

Reemplazo complejo adicional

Tomemos un descanso de Coleridge y usémoslo sed para eliminar nombres etc/passwd expediente.

Hay formas más cortas de hacer esto (más sobre eso más adelante), pero usaremos la ruta más larga aquí para ilustrar otro concepto. Todos los elementos adecuados en un patrón de búsqueda (conocidos como subexpresiones) se pueden numerar (hasta un máximo de nueve elementos). Entonces puede usar estos números en su sed las órdenes se refieren a subexpresiones específicas.

Debes incluir subexpresión entre paréntesis [()] para que eso funcione. Los corchetes también deben estar respaldados por corchetes () evitar que sean tratados como un personaje normal.

Para hacer esto, debe escribir lo siguiente:

sed 's/([^:]*).*/1/' /etc/passwd

Analicemos esto:

  • sed 's/: Un sed mando y comienzo de la representación.
  • (: Soporte abierto [(] que comprende la subexpresión, precedida de una reacción violenta ().
  • [^:]*: La primera subexpresión del término de búsqueda es un grupo entre corchetes. El carro (^) «no» cuando se usa en un grupo. Cualquier grupo de caracteres significa sin dos puntos (:) se tomará como un juego.
  • ): Soporte de cierre [)] con espalda anterior).
  • .*: Esta segunda subfrase de búsqueda significa «cualquier carácter y cualquier número de ellos».
  • /1: La parte representativa de la oración. 1 avanzar con barra invertida). Este es el texto que coincide con la primera subexpresión.
  • /': Barra de extremo oblicua (/) y comillas simples (') terminar sed pedido.

Todo esto significa que estamos buscando cualquier cadena que no tenga dos puntos (:), que será la primera instancia del texto correspondiente. Luego buscamos cualquier otra cosa en esa línea, que será el segundo caso para hacer coincidir el texto. Reemplazaremos toda la línea con el texto que coincida con la primera subexpresión.

Todas las líneas ingresadas /etc/passwd el archivo comienza con un nombre de usuario que termina en dos puntos. Emparejamos todo con los dos primeros puntos y luego sustituimos ese valor por toda la línea. Así que aislé el nombre de usuario.

Salir de

A continuación, incluiremos la segunda subexpresión entre paréntesis. [()] para que podamos referirnos a él por número. Te reemplazaremos 1 le 2. Nuestro comando ahora vendrá a reemplazar completamente toda la línea desde los dos primeros puntos (:) hasta el final de la línea.

Introducimos lo siguiente:

sed 's/([^:]*)(.*)/2/' /etc/passwd

Estos pequeños cambios invierten el significado del comando y obtenemos todo excepto los nombres de usuario.

Ahora, veamos la forma rápida y fácil de hacer esto.

Nuestro término de búsqueda es de los dos primeros puntos (:) hasta el final de la línea. Porque nuestra expresión de representación está vacía (//), no sustituiremos nada por el texto correspondiente.

Entonces escribimos lo siguiente, cortando todo desde los dos primeros puntos (:) al final de la línea, dejando solo el nombre de usuario:

sed 's/:.*//" /etc/passwd

Veamos un ejemplo en el que nos referimos al primer y segundo juego en el mismo orden.

Tenemos un archivo de coma (,) la separación del apellido. Queremos listarlos como «nombre, apellido». Nosotros podemos usar cat, como se muestra a continuación, para ver el contenido del archivo:

cat geeks.txt

Como mucho sed comandos, al principio aparentemente imperceptibles:

sed 's/^(.*),(.*)$/2,1 /g' geeks.txt

Este es un pedido de reemplazo como los otros que usé, y el patrón de búsqueda es bastante fácil. Lo detallaremos a continuación:

  • sed 's/: Orden de reemplazo normal.
  • ^: Porque el indicador no está en un grupo ([]), «Inicio de línea».
  • (.*),: La primera subexpresión es cualquier número de caracteres. Está entre paréntesis. [()]y un resbalón antes de cada) para que podamos referirnos a él por número. Todo nuestro patrón de búsqueda hasta ahora se traduce desde la búsqueda desde el principio de la línea hasta la primera coma (,) cualquier número de caracteres.
  • (.*): La siguiente subexpresión (nuevamente) es cualquier número de cualquier carácter. También se incluye entre corchetes. [()], detrás del frente antes de ambos () para que podamos referirnos al texto apropiado por número.
  • $/: signo de dólar ($) representa el final de la línea y permitirá que nuestra búsqueda continúe hasta el final de la línea. Solo usé esto para ingresar el signo de dólar. Realmente no lo necesitamos aquí, debido al asterisco (*) iría al final de la línea en este caso. Barra inclinada frontal (/) completa la sección de plantillas de búsqueda.
  • 2,1 /g': Como hemos incluido nuestras dos subexpresiones entre paréntesis, podemos referirnos a ambas por su número. Como queremos invertir el orden, los introducimos como second-match,first-match. Los números deben ir precedidos de una barra invertida ().
  • /g: Esto permite que nuestro comando opere globalmente en todas las líneas.
  • geeks.txt: El archivo en el que estamos trabajando.

También puede utilizar el comando Short (c) reemplace líneas completas que coincidan con su patrón de búsqueda. Agregamos lo siguiente para buscar una línea con la palabra «cuello» y la reemplazamos con una nueva cadena de texto:

sed '/neck/c Around my wrist was strung' coleridge.txt

Nuestra nueva línea aparece ahora al final de nuestro extracto.

Insertar líneas y texto

También podemos agregar nuevas líneas y texto a nuestro archivo. Para insertar nuevas líneas después de las coincidentes, usaremos el comando Agregar (a).

Aquí está el archivo con el que trabajaremos:

gato geeks.txt

Numeré las filas para que esto sea un poco más fácil de seguir.

Ingrese lo siguiente para buscar líneas que contengan la palabra «Él» e inserte una nueva línea debajo de ellas:

sed '/He/a --> Inserted!' geeks.txt

Ingrese lo siguiente e ingrese el comando (i(b) inserte la nueva línea encima de la línea que contiene el texto apropiado:

sed '/He/i --> Inserted!' geeks.txt

Podemos usar ampersand (&), indicando el texto original apropiado, para agregar texto nuevo a una línea coincidente. 1 , 2, y así sucesivamente, representa subexpresiones coincidentes.

Para agregar texto al comienzo de una línea, usaremos un comando de reemplazo que coincida con todo en la línea, junto con una cláusula de reemplazo que combina nuestro nuevo texto con la línea de base.

Para hacer todo esto, se introduce lo siguiente:

sed 's/.*/--> Inserted &/' geeks.txt

Presentamos lo siguiente, inclusivo G comando, que colocará una línea en blanco entre cada línea:

sed 'G' geeks.txt

Si desea agregar dos o más líneas en blanco, puede usarlas G;G, G;G;G, etcétera.

Eliminar líneas

Eliminar comando (d) elimina las líneas que coinciden con un patrón de búsqueda o las especificadas por números o rangos consecutivos.

Por ejemplo, para eliminar la tercera línea, escribí lo siguiente:

sed '3d' geeks.txt

Para borrar el rango de línea de cuatro a cinco, agregamos lo siguiente:

sed '4,5d' geeks.txt

Para eliminar líneas fuera de rango, use un signo de exclamación (!), Como se muestra abajo:

sed '6,7!d' geeks.txt

Guarda tus cambios

Hasta ahora, todos nuestros resultados se han impreso en la ventana del terminal, pero aún no los hemos guardado en ningún lugar. Para que sean permanentes, puede sobrescribir los cambios en el archivo original o redirigirlos a uno nuevo.

Se debe tener cuidado al escribir el archivo original. si es tuyo sed el comando es incorrecto, puede realizar algunos cambios en el archivo original que son difíciles de cancelar.

Con algo de tranquilidad sed capaz de crear una copia de seguridad del archivo original antes de realizar un pedido.

Puede utilizar la opción en el sitio (-i) decir sed para escribir cambios en el archivo original, pero si agrega una extensión de archivo, sed el archivo original creará una copia de seguridad de uno nuevo. Tendrá el mismo nombre que el archivo original, pero con una nueva extensión de archivo.

Para probarlo, buscamos cualquier línea que contenga la palabra «Él» y la borramos. Haremos una copia de seguridad de nuestro archivo original en uno nuevo usando la extensión BAK.

Para hacer todo esto, se introduce lo siguiente:

sed -i'.bak' '/^.*He.*$/d' geeks.txt

Agregamos lo siguiente para asegurarnos de que nuestro archivo de respaldo permanezca sin cambios:

cat geeks.txt.bak

También podemos escribir lo siguiente para redirigir la salida a un nuevo archivo y obtener un resultado similar:

sed -i'.bak' '/^.*He.*$/d' geeks.txt > new_geeks.txt

Usamos cat confirme que los cambios se hayan escrito en el nuevo archivo, como se muestra a continuación:

cat new_geeks.txt

RELACIONADO: ¿Cómo se usa realmente Regex?

Tiene sed de todo esto

Como habrás notado, incluso esta introducción rápida sed es lo suficientemente largo. Hay muchos en este orden y realmente hay puedes hacer más con eso.

Sin embargo, espero que estos conceptos básicos le hayan proporcionado una base sólida sobre la que pueda construir a medida que aprende más.

RELACIONADO: 10 comandos básicos de Linux para principiantes