← Terminal y Línea de Comandos en Linux Bloque 6 · Filtrar y transformar texto · Tema 29 de 43

Tema 29

Editar texto al vuelo con sed

Hay que cambiar una palabra por otra en un archivo de diez mil líneas. O en cincuenta archivos. O en la salida de un comando, que ni siquiera es un archivo. Abrir un editor no es una opción. Lo que hace falta es un editor al que se le pueda decir de antemano qué hacer, y que lo haga solo, sin pantalla ni teclado. Ese editor es sed, y su orden más famosa ya la conocemos: es el :s/viejo/nuevo/ de vim, sacado del editor y puesto en una tubería.

1. Un editor sin pantalla

sed es la abreviatura de stream editor, editor de flujo. El nombre describe su manera de trabajar, que es distinta de la de nano o vim:

sed lee su entrada línea por línea, aplica a cada una las órdenes de edición que se le dieron en la línea de comandos, y escribe el resultado en su salida.

El ciclo de sed: lee una línea de la entrada, le aplica las órdenes de edición, escribe el resultado en la salida, y vuelve a empezar con la línea siguiente Leer una línea Aplicar las órdenes Escribir el resultado la línea siguiente
El ciclo de sed, que se repite hasta agotar la entrada. Cada línea se procesa por separado, sin memoria de las anteriores.

Es un filtro, con todas las propiedades que conocemos: lee de un archivo o de su entrada estándar, escribe en su salida, y por defecto no modifica el archivo original. Las tres diferencias con un editor interactivo:

nano, vimsed
Las órdenes se danSobre la marcha, mirando el textoDe antemano, en la línea de comandos
El texto se veTodo, en pantallaNo se ve: pasa
Sirve paraUn cambio pensado en un archivoEl mismo cambio en muchas líneas, muchos archivos, o en una tubería

sed es un lenguaje completo, con decenas de órdenes. En la práctica, nueve de cada diez usos son una sola: sustituir. Empezamos por ella y le dedicamos la mitad del tema.

2. La orden s: sustituir

anatomía de una sustitución
sed 's/Rosario/ROS/g' ventas.csv
     │ │       │   │  │
     │ │       │   │  └─ el archivo de entrada
     │ │       │   └─ modificador: en todas las apariciones de cada línea
     │ │       └─ el texto que lo reemplaza
     │ └─ lo que se busca: una expresión regular
     └─ la orden: s, sustituir

La orden completa va entre comillas simples, para que la shell no interprete nada. Tiene tres partes separadas por barras: la letra s, lo que se busca y el reemplazo. Las tres barras son obligatorias, también la última.

terminal, en ~/practica
$ cd ~/practica
$ sed 's/Rosario/ROS/' ventas.csv | head -n 3
2026-10-01,Luis,ROS,teclado,2,90
2026-10-01,Marta,Mendoza,monitor,1,320
2026-10-02,Ana,Salta,mouse,5,75
$ grep -c Rosario ventas.csv         # el archivo sigue igual
5

Las líneas donde no hay nada que sustituir pasan sin cambios: sed escribe todas las líneas, modificadas o no. Es la diferencia con grep, que solo deja pasar algunas. Y el archivo no se tocó: el resultado está en la pantalla, y se puede enviar a una tubería o redirigir a otro archivo.

Como en toda tubería, sed acepta también la salida de otro comando:

terminal
$ pwd | sed 's/ana/USUARIO/'
/home/USUARIO/practica

3. La primera aparición, y la g

La orden s tiene un comportamiento por defecto que sorprende a todos la primera vez:

Sin modificador, s reemplaza solo la primera aparición de cada línea

Si lo buscado aparece tres veces en una línea, se cambia la primera y las otras dos quedan como estaban. Para reemplazarlas todas se agrega una g, de global, después de la última barra. Es el olvido más frecuente con sed, y el resultado —un archivo cambiado a medias— puede pasar inadvertido.

terminal: reemplazar las comas de la primera línea
$ head -n 1 ventas.csv | sed 's/,/;/'      # solo la primera
2026-10-01;Luis,Rosario,teclado,2,90
$ head -n 1 ventas.csv | sed 's/,/;/g'     # todas
2026-10-01;Luis;Rosario;teclado;2;90
$ head -n 1 ventas.csv | sed 's/,/;/2'     # solo la segunda
2026-10-01,Luis;Rosario,teclado,2,90
ModificadorEfecto
NingunoReemplaza la primera aparición de cada línea.
gReemplaza todas las apariciones de cada línea.
Un número, como 2Reemplaza solo esa aparición.
INo distingue mayúsculas de minúsculas al buscar.
pImprime la línea si hubo reemplazo. Se usa con -n; sección 9.

Los modificadores se combinan: s/luis/LUIS/Ig reemplaza todas las apariciones, estén escritas como estén. «Global» se refiere a la línea, no al archivo: sed recorre siempre el archivo entero; lo que la g cambia es cuántas veces actúa dentro de cada línea.

4. Buscar con expresiones regulares

La parte de búsqueda no es un texto fijo: es una expresión regular, con todo lo del tema 28. Y como allí, hay dos dialectos. Sin opciones, sed usa el básico; con -E, el extendido, que es el que adoptamos:

terminal
$ sed -E 's/[0-9]+$/XXX/' ventas.csv | head -n 2     # el número del final
2026-10-01,Luis,Rosario,teclado,2,XXX
2026-10-01,Marta,Mendoza,monitor,1,XXX
$ sed -E 's/^[^,]*,//' ventas.csv | head -n 2        # quitar el primer campo
Luis,Rosario,teclado,2,90
Marta,Mendoza,monitor,1,320

El segundo ejemplo muestra una forma muy usada: un reemplazo vacío. Entre la segunda y la tercera barra no hay nada, de modo que lo encontrado se sustituye por nada: se borra. Así se eliminan prefijos, sufijos, espacios sobrantes o columnas.

OrdenEfecto
s/^/> /Agrega > al comienzo de cada línea: el ancla coincide con una posición, y ahí se inserta.
s/$/;/Agrega un punto y coma al final de cada línea.
s/[[:space:]]+$//Quita los espacios del final de cada línea.
s/^[[:space:]]+//Quita los espacios del comienzo.
s/#.*//Quita los comentarios: desde un # hasta el final de la línea.
s/ +/ /gReduce varios espacios seguidos a uno.

Las dos primeras filas no «reemplazan» ningún carácter. Las anclas ^ y $ coinciden con posiciones vacías, y sustituir una posición vacía por un texto es insertarlo. Vale también lo aprendido sobre la codicia: s/,.*// borra desde la primera coma hasta el final, porque .* toma todo lo que puede.

5. El reemplazo: & y los grupos

La parte de reemplazo es texto literal, con dos excepciones que le dan a sed su potencia. Permiten volver a usar lo que se encontró.

En el reemplazoVale por
&Todo el texto que coincidió con la búsqueda.
\1, \2, …El texto que coincidió con el primer grupo entre paréntesis, con el segundo, y así.

El ampersand sirve para agregar algo alrededor de lo encontrado sin perderlo:

terminal
$ sed -E 's/[0-9]+$/$& pesos/' ventas.csv | head -n 2
2026-10-01,Luis,Rosario,teclado,2,$90 pesos
2026-10-01,Marta,Mendoza,monitor,1,$320 pesos
$ sed 's/.*/"&"/' tareas.txt | head -n 2             # cada línea, entre comillas
"Comprar pan"
"Llamar a Luis"

La búsqueda no sabía qué número había al final de cada línea; el & lo reprodujo, cualquiera fuese.

Los grupos van más lejos, y son las retrorreferencias que anunciamos en el tema anterior. Se rodea con paréntesis cada parte que interesa conservar, y en el reemplazo se las vuelve a colocar en el orden que se quiera. Para pasar las fechas de año-mes-día a día/mes/año:

terminal
$ sed -E 's|^([0-9]{4})-([0-9]{2})-([0-9]{2})|\3/\2/\1|' ventas.csv | head -n 3
01/10/2026,Luis,Rosario,teclado,2,90
01/10/2026,Marta,Mendoza,monitor,1,320
02/10/2026,Ana,Salta,mouse,5,75
la orden, leída
^([0-9]{4})    grupo 1: cuatro dígitos, al comienzo        →  2026
-              un guion, que no se conserva
([0-9]{2})     grupo 2: dos dígitos                        →  10
-              otro guion
([0-9]{2})     grupo 3: dos dígitos                        →  01

\3/\2/\1       el reemplazo: grupo 3, barra, grupo 2, barra, grupo 1

Con la misma técnica se intercambian columnas, cosa que cut no sabía hacer:

terminal: intercambiar el segundo campo con el tercero
$ sed -E 's/^([^,]*),([^,]*),([^,]*)/\1,\3,\2/' ventas.csv | head -n 2
2026-10-01,Rosario,Luis,teclado,2,90
2026-10-01,Mendoza,Marta,monitor,1,320

Como el & es especial en el reemplazo, para escribir uno literal hay que escaparlo: \&.

6. Otros delimitadores

En el ejemplo de las fechas, la orden no usó barras para separar sus partes, sino barras verticales. Es una libertad de la orden s: el carácter que sigue a la s es el delimitador, sea cual sea.

Hace falta cuando el texto a buscar o a reemplazar contiene barras, lo que ocurre siempre con las rutas. Con el delimitador habitual, cada barra del texto habría que escaparla:

terminal: la misma sustitución, escrita de dos maneras
$ pwd | sed 's/\/home\/ana/~/'       # con barras: hay que escapar cada una
~/practica
$ pwd | sed 's|/home/ana|~|'         # con otro delimitador: se lee
~/practica

La primera forma es conocida, con humor, como el «síndrome del palillo inclinado». Los delimitadores alternativos más usados son |, #, , y :; conviene elegir uno que no aparezca en el texto.

7. Direcciones: a qué líneas

Hasta aquí cada orden se aplicó a todas las líneas. Anteponiéndole una dirección se la limita a algunas.

Una dirección es una condición, escrita delante de una orden, que indica a qué líneas se aplica: un número de línea, un patrón, o un rango entre dos de ellos.

DirecciónLa orden se aplica a…
3La línea 3.
$La última línea.
2,4Las líneas de la 2 a la 4.
3,$Desde la 3 hasta el final.
/Salta/Las líneas que coinciden con esa expresión regular.
/inicio/,/fin/Desde una línea que coincide con la primera expresión hasta la siguiente que coincide con la segunda.
2,4!Todas menos las de la 2 a la 4. El signo de exclamación niega.
terminal
$ sed '3s/^/HECHO: /' tareas.txt            # solo en la línea 3
Comprar pan
Llamar a Luis
HECHO: Pagar la luz
Estudiar vim
Regar las plantas
$ sed '/Rosario/s/Luis/L./' ventas.csv | head -n 4   # solo en las líneas de Rosario
2026-10-01,L.,Rosario,teclado,2,90
2026-10-01,Marta,Mendoza,monitor,1,320
2026-10-02,Ana,Salta,mouse,5,75
2026-10-02,L.,Rosario,cable,10,40

El segundo ejemplo se lee en dos tiempos: «en las líneas que contienen Rosario, sustituir Luis por L.». La dirección elige las líneas; la orden actúa dentro de ellas. El Luis que vendió en Salta, más abajo, quedaría intacto.

Hay que distinguir los dos usos de una expresión entre barras. Sola y delante, /Rosario/ es una dirección: selecciona líneas. Después de una s es lo que se busca para reemplazar. En /Rosario/s/Luis/L./ aparecen los dos.

8. d: borrar líneas

La segunda orden en importancia es d, de delete. Elimina la línea: no la escribe en la salida. Casi siempre lleva una dirección, porque sin ella borraría todo.

terminal
$ sed '2,4d' tareas.txt              # borrar de la línea 2 a la 4
Comprar pan
Regar las plantas
$ sed '/Luis/d' tareas.txt           # borrar las que contienen «Luis»
Comprar pan
Pagar la luz
Estudiar vim
Regar las plantas
OrdenBorraEquivale a
sed '1d'La primera línea: el encabezado de un archivo de datos.tail -n +2
sed '$d'La última línea.head -n -1
sed '/^$/d'Las líneas vacías.grep -v '^$'
sed '/^#/d'Las líneas de comentario.grep -v '^#'
sed '/patrón/d'Las que coinciden.grep -v 'patrón'
sed '/patrón/!d'Las que no coinciden.grep 'patrón'

La tercera columna muestra que d con una dirección de patrón hace lo mismo que grep -v. Para ese único fin, grep es más claro. sed conviene cuando el borrado es por número de línea, por rango entre dos patrones, o cuando en la misma pasada hay además algo que sustituir.

9. p y -n: mostrar solo algunas

La orden p, de print, escribe la línea en la salida. Sola parece inútil, porque sed ya escribe todas las líneas al terminar cada ciclo; con ella, las elegidas aparecerían duplicadas. Cobra sentido junto con una opción de la línea de comandos:

La opción -n desactiva la escritura automática: sed no muestra ninguna línea, salvo las que una orden p imprima expresamente.

terminal
$ sed -n '2,4p' tareas.txt           # solo las líneas 2 a 4
Llamar a Luis
Pagar la luz
Estudiar vim
$ sed -n '$p' tareas.txt             # solo la última
Regar las plantas
$ sed -n '/Salta/p' ventas.csv       # solo las que coinciden: como grep
2026-10-02,Ana,Salta,mouse,5,75
2026-10-05,Luis,Salta,mouse,3,45

La primera forma es la herramienta que prometimos en el tema 12, cuando extraer un tramo de un archivo exigía combinar head y tail. sed -n '20,30p' archivo lo dice directamente, y es la manera habitual de mirar las líneas que rodean a un error cuando un mensaje indica «línea 25».

El rango entre dos patrones no tiene equivalente simple en otras herramientas. Extrae un bloque delimitado por su contenido:

terminal: desde la primera venta del día 2 hasta la primera del día 5
$ sed -n '/10-02/,/10-05/p' ventas.csv
2026-10-02,Ana,Salta,mouse,5,75
2026-10-02,Luis,Rosario,cable,10,40
2026-10-03,Marta,Rosario,teclado,1,45
2026-10-03,Ana,Mendoza,monitor,2,640
2026-10-05,Luis,Salta,mouse,3,45

En un archivo de configuración o en un registro, así se obtiene una sección: desde la línea que la abre hasta la que la cierra. El rango termina en la primera línea que coincide con el segundo patrón, y por eso la otra venta del día 5 no figura.

Con -n, el modificador p de la orden s muestra únicamente las líneas donde hubo un reemplazo: sed -n 's/Salta/SLA/p' ventas.csv selecciona y transforma en un solo paso.

10. Insertar, añadir y otras órdenes

OrdenNombreEfecto
i textoinsertInserta una línea antes de la indicada.
a textoappendAñade una línea después.
c textochangeReemplaza la línea entera por ese texto.
y/abc/xyz/transliterateCambia caracteres uno por uno, como tr.
qquitTermina en ese punto, sin leer el resto.
=Escribe el número de la línea.
terminal
$ sed '1i fecha,vendedor,ciudad,producto,cantidad,importe' ventas.csv | head -n 3
fecha,vendedor,ciudad,producto,cantidad,importe
2026-10-01,Luis,Rosario,teclado,2,90
2026-10-01,Marta,Mendoza,monitor,1,320
$ sed '$a -- fin de la lista --' tareas.txt | tail -n 2
Regar las plantas
-- fin de la lista --
$ sed '2q' tareas.txt                # terminar después de la línea 2: como head -n 2
Comprar pan
Llamar a Luis

El primer ejemplo resuelve una tarea real: agregar la fila de títulos a un archivo de datos que no la tiene. Insertar antes de la línea 1 es poner algo al principio; añadir después de la última, con $a, es poner algo al final.

q es valiosa en archivos enormes. sed -n '1000p' archivo imprime la línea 1000 y sigue leyendo hasta el final, inútilmente; sed -n '1000{p;q}' archivo la imprime y termina.

11. Varias órdenes a la vez

Una sola pasada de sed puede aplicar varias órdenes. Cada línea las recibe en el orden en que están escritas, y cada una trabaja sobre el resultado de la anterior. Hay tres maneras de escribirlas:

FormaEjemplo
Separadas por punto y comased 's/a/b/; s/c/d/' archivo
Una opción -e por ordensed -e 's/a/b/' -e 's/c/d/' archivo
En un archivo, una por líneased -f ordenes.sed archivo
terminal: abreviar las tres ciudades en una pasada
$ sed 's/Rosario/ROS/; s/Mendoza/MZA/; s/Salta/SLA/' ventas.csv | cut -d, -f3 | sort | uniq -c
      3 MZA
      5 ROS
      2 SLA

Podrían haberse encadenado tres sed con tuberías, con el mismo resultado y tres procesos en lugar de uno. Cuando todas las órdenes son sustituciones independientes, una sola invocación es más limpia.

Para aplicar varias órdenes a las mismas líneas, se las agrupa entre llaves detrás de una dirección común:

terminal: en las líneas de Salta, dos cambios
$ sed -n '/Salta/{s/mouse/MOUSE/; s/,/ | /g; p}' ventas.csv
2026-10-02 | Ana | Salta | MOUSE | 5 | 75
2026-10-05 | Luis | Salta | MOUSE | 3 | 45

El orden importa. Si una orden produce un texto que la siguiente busca, se encadenan: s/a/b/; s/b/c/ convierte las «a» en «c». Y una d corta el ciclo: las órdenes que la siguen no se ejecutan para esa línea.

12. -i: modificar el archivo

Todo lo anterior dejó los archivos intactos. Cuando el propósito es justamente cambiar el archivo, la redirección no sirve: sed '…' archivo > archivo lo vacía, por lo que vimos en el tema 23. Para eso sed tiene una opción propia.

La opción -i, de in place, hace que sed escriba el resultado en el mismo archivo que leyó, reemplazando su contenido. No muestra nada en la pantalla.

Es la opción con la que sed deja de ser inofensivo. La probamos sobre una copia:

terminal
$ cp ventas.csv /tmp/v.csv
$ sed -i 's/Rosario/ROS/' /tmp/v.csv         # sin salida: el archivo cambió
$ grep -c ROS /tmp/v.csv
5
$ sed -i.bak 's/Salta/SLA/' /tmp/v.csv       # con copia de respaldo
$ ls /tmp/v.csv*
/tmp/v.csv  /tmp/v.csv.bak

Con un sufijo pegado a la opción, como -i.bak, sed guarda antes una copia del original con ese sufijo. Es la forma prudente, y no cuesta nada.

Con -i no hay deshacer: primero sin -i, después con -i

Una expresión regular que coincide con más de lo previsto, aplicada con -i a un archivo de configuración o a cincuenta archivos de un proyecto, los cambia todos en un instante y en silencio. El procedimiento seguro tiene tres pasos, y son los de siempre: ejecutar la orden sin -i y mirar el resultado; recuperar la línea con la flecha arriba y agregar -i.bak; comprobar, y recién entonces borrar los respaldos.

  1. Ver qué líneas cambiarían: sed -n 's/viejo/nuevo/gp' archivo. mirar
  2. Aplicar con respaldo: sed -i.bak 's/viejo/nuevo/g' archivo. cambiar
  3. Comparar el original y el resultado: diff archivo.bak archivo. comprobar

diff, que muestra las diferencias entre dos archivos, es el tema 31. Dos detalles más sobre -i. Por dentro no modifica el archivo: escribe uno nuevo y lo pone en el lugar del anterior, de modo que el archivo cambia de inodo, y un enlace duro al original deja de acompañarlo, según lo que vimos en el tema 14. Y acepta varios archivos, con lo que un comodín o un find … -exec aplican el mismo cambio a todo un proyecto: razón de más para probar antes.

13. sed entre las otras herramientas

Varias cosas que hace sed las hacen también otros filtros, y conviene tener un criterio para elegir:

TareaCon sedCon otra herramientaConviene
Mostrar las líneas que coincidensed -n '/x/p'grep 'x'grep
Quitar las que coincidensed '/x/d'grep -v 'x'grep
Las primeras N líneassed 'Nq'head -n Nhead
Un rango de líneassed -n '5,9p'head -n 9 | tail -n 5sed
Cambiar un carácter por otrosed 'y/,/;/'tr ',' ';'tr
Cambiar un texto por otrosed 's/x/y/g'—sed
Reordenar partes de una líneased -E 's/(a)(b)/\2\1/'awkSegún el caso
Calcular con los campos—awkawk

El territorio propio de sed es la sustitución de texto: nada lo hace mejor ni de manera más breve. Para seleccionar, grep es más claro. Y para todo lo que tenga que ver con columnas y con cuentas, lo indicado es awk, que estudiamos en el tema siguiente.

Hay una coincidencia que vale la pena notar, porque ahorra aprendizaje. La orden de sustitución de sed es la misma de vim, que vimos en el tema 13, y las direcciones también: :2,4d, :%s/viejo/nuevo/g. Los dos descienden del mismo antepasado, el editor ed, de donde también salió grep.

14. Recetas y errores comunes

Quiero…Comando
Cambiar un texto por otro en todo un archivosed 's/viejo/nuevo/g' archivo
Lo mismo, modificando el archivosed -i.bak 's/viejo/nuevo/g' archivo
Ver las líneas 20 a 30sed -n '20,30p' archivo
Quitar la primera líneased '1d' archivo
Quitar comentarios y líneas vacíassed -E '/^[[:space:]]*(#|$)/d' archivo
Quitar los espacios del final de cada líneased -E 's/[[:space:]]+$//' archivo
Convertir finales de línea de Windowssed 's/\r$//' archivo
Comentar una línea de configuraciónsed -E 's/^(opcion=.*)/# \1/' archivo
Cambiar el valor de una opciónsed -E 's/^(puerto=).*/\18080/' archivo
Agregar una fila de títulossed '1i a,b,c' archivo

Las dos filas sobre configuración muestran el uso más frecuente de sed en administración: cambiar un ajuste desde un script, sin abrir un editor. En la última de ellas, \1 conserva el nombre de la opción, y lo que sigue es el valor nuevo.

SíntomaCausaSolución
Solo cambió una vez por línea.Falta el modificador g.s/a/b/g
unterminated `s' commandFalta la barra final, o el texto contiene una barra sin escapar.Cerrar con la tercera barra; usar otro delimitador.
Los paréntesis o el + no funcionan.Falta -E: se están tomando como texto.sed -E
Se borró más de lo esperado.Un .* codicioso.Una clase negada: [^,]*.
El archivo quedó vacío.Se usó sed … archivo > archivo.sed -i.
Una variable no se reemplazó dentro de la orden.Las comillas simples impiden la expansión.Comillas dobles: sed "s/$viejo/$nuevo/".
No encuentra un texto que ocupa dos líneas.sed procesa de a una línea.Otra herramienta, o técnicas avanzadas de sed.

La referencia del tema:

Se escribeQué hace
sed 's/a/b/'Reemplaza la primera aparición de cada línea.
sed 's/a/b/g'Reemplaza todas.
sed -E 's/(x)(y)/\2\1/'Usa expresiones extendidas, y grupos en el reemplazo.
sed 's|a|b|'Lo mismo, con otro delimitador.
sed '3s/a/b/', sed '/x/s/a/b/'Solo en la línea 3; solo en las líneas que coinciden.
sed '2,4d', sed '/x/d'Borra líneas.
sed -n '2,4p', sed -n '/x/p'Muestra solo esas líneas.
sed '1i texto', sed '$a texto'Inserta al principio; añade al final.
sed 'a; b'Varias órdenes.
sed -i.bak '…' archivoModifica el archivo, guardando una copia.

Los archivos de /tmp pueden quedar; el directorio de práctica no se modificó. En el tema 30 conocemos la última gran herramienta del bloque, la que entiende de columnas y sabe sumar: awk.

15. Resumen

16. Preguntas de repaso

Intenta responder cada una antes de abrir la respuesta.

1. ¿Modifica el archivo el comando sed 's/a/b/' datos.txt?

No. Escribe el resultado en su salida. Para modificar el archivo hace falta la opción -i.

2. ¿Qué diferencia hay entre s/a/b/ y s/a/b/g?

La primera reemplaza solo la primera aparición de cada línea. La segunda, todas.

3. ¿Qué hace sed 's/ *$//' archivo?

Quita los espacios que haya al final de cada línea: los sustituye por nada.

4. ¿Qué hace sed 's/^/# /' archivo?

Agrega # al comienzo de cada línea. El ancla coincide con la posición inicial, y el texto se inserta allí.

5. ¿Qué representa el & en el reemplazo?

Todo el texto que coincidió con la búsqueda. s/[0-9]+/(&)/ rodea con paréntesis el número encontrado.

6. ¿Qué hace sed -E 's/([^,]*),([^,]*)/\2,\1/'?

Intercambia los dos primeros campos de cada línea de un archivo separado por comas.

7. ¿Por qué se escribe a veces s|a|b| en lugar de s/a/b/?

Porque el carácter que sigue a la s es el delimitador, y elegir uno distinto de la barra evita tener que escapar las barras de una ruta.

8. ¿Qué diferencia hay entre sed '5s/a/b/' y sed '/5/s/a/b/'?

La primera aplica la sustitución solo a la línea número 5. La segunda, a las líneas que contienen el carácter «5».

9. ¿Qué hacen sed '1d', sed '$d' y sed '/^$/d'?

Borran la primera línea, la última, y las líneas vacías, respectivamente.

10. ¿Para qué sirve la opción -n?

Desactiva la escritura automática de cada línea. Solo aparece lo que una orden p imprima, lo que permite mostrar una selección de líneas.

11. Escribe el comando para mostrar las líneas 100 a 120 de un archivo.

sed -n '100,120p' archivo

12. ¿Qué muestra sed -n '/INICIO/,/FIN/p' archivo?

El bloque que va desde la primera línea que contiene «INICIO» hasta la siguiente que contiene «FIN», ambas incluidas.

13. ¿Cómo se agrega una línea al principio de un archivo, y cómo al final?

Con sed '1i texto' se inserta antes de la primera línea, y con sed '$a texto' se añade después de la última.

14. ¿Qué hace -i.bak, y qué conviene hacer antes de usarla?

Modifica el archivo en su lugar, guardando una copia del original con el sufijo .bak. Antes conviene ejecutar la misma orden sin -i y revisar el resultado.

15. ¿Por qué no funciona sed 's/$nombre/X/' archivo si nombre es una variable?

Porque entre comillas simples la shell no expande las variables. Hay que usar comillas dobles: sed "s/$nombre/X/" archivo.

Para practicar

  1. Con ventas.csv y sin modificarlo: cambia monitor por pantalla; cambia todas las comas por tabulaciones (\t); quita el campo de la fecha.
  2. Muestra las líneas 4 a 7 de ventas.csv, luego solo la última, y luego todas menos la primera y la última.
  3. Con grupos, convierte cada línea de ventas.csv al formato Luis vendió 2 teclado en Rosario. Empieza por describir los seis campos con ([^,]*).
  4. Agrega a tareas.txt, sin modificarlo, un guion y un espacio al comienzo de cada línea, y un punto al final.
  5. Numera las tareas combinando nl y sed, de modo que queden como 1) Comprar pan.
  6. En una copia de informe.txt en /tmp, elimina los comentarios y las líneas vacías con una sola invocación de sed. ¿Cuántas líneas quedan?
  7. Sobre esa copia, aplica el procedimiento de la sección 12 para cambiar todos los tcp por TCP: primero mira, luego -i.bak, luego compara con diff … | head.
  8. Muestra de /etc/passwd solo el nombre y la shell de cada cuenta, con el formato ana usa /bin/bash, usando una sola sustitución con grupos.
  9. Con ls -l | sed -E, deja de cada línea solo los permisos y el nombre. Pista: describe lo del medio con .* y aprovecha la codicia.
  10. Prueba sed 's/a/b' tareas.txt y sed 's/(a)/[\1]/' tareas.txt. Lee los resultados, explícalos y corrígelos.