En determinadas ocasiones necesitamos eliminar alguna línea en específico de un archivo o de varios, por ejemplo, me ha sucedido que he tenido todo un listado de archivos y necesito eliminar la línea #27 de todos estos (la línea #27 es la de una ACL, norma, regla, configuración), bien puedo editar archivo por archivo o simplemente puedo lograr lo que necesito usando el comando sed y un script bash (opcional).
Pero, intentemos con un solo archivo algo simple.
Tenemos el archivo distros-deb.txt el cual contiene esto:
debian
kubuntu
archlinux
solusos
mint
O sea, el archivo distros-deb.txt es en el cual pondremos las distros basadas en Debian, pero ahí vemos que en la línea #3 está «archlinux», distro que evidentemente no tiene nada que ver con Debian, por lo que debemos eliminar esa línea. Para eliminar la línea #3 de ese archivo pondremos lo siguiente:
sed "3d" distros-deb.txt > distros-deb-ok.txt
Explicar esta línea es algo fácil, con sed «3d» estamos indicando que eliminaremos la línea #3, con distros-deb.txt le indicamos sobre qué archivo trabajar, o sea, eliminar la línea #3 de este archivo, hasta aquí si presionamos <kbd>Enter</kbd> nos mostrará lo que deseamos pero en la terminal, por lo que con > distros-deb-ok.txt estamos indicando que en vez de mostrar en terminal el resultado, que lo ponga en un archivo con este nombre.
¿A que es simple?
También, podemos evitar usar el > distros-deb-ok.txt usando un parámetro propio de sed, el parámetro -i
O sea, en caso de que deseemos eliminar la línea del archivo y guardarlo con su mismo nombre (y no en otro archivo) basta con agregar el parámetro -i :
sed -i "3d" distros-deb.txt
Esto eliminará la línea #3 de distros-deb.txt y lo guardará.
¿Qué sucede si deseo un rango de líneas, o sea eliminar la línea #3 pero también la #4 y #5? Para lograr esto ponemos el rango del 3 al 5, o sea:
sed -i "3,5d" distros-deb.txt
Y me mostrará solamente debian y kubuntu
¿Y qué si deseo eliminar desde la línea 2 hasta la última, cuando no conozco el total de líneas?
Bastaría con usar el símbolo de dollar -» $
sed -i "2,$d" distros-deb.txt
En caso de que se desee eliminar desde la primera línea hasta la #4 entonces simplemente ponemos el valor 1 al inicio:
sed -i "1,4d" distros-deb.txt
Esto viene siendo todo, un tip bastante útil cuando se desea hacer scripts bash para automatizar tareas y se necesita modificar y eliminar líneas de archivos de configuración, para modificar podemos usar sed o perl, así como para eliminar ya sabemos cómo hacerlo con sed
Saludos
Muy buen aporte 😉
Gracias 🙂
By the way, nos llegó tu email ahora mismo te respondo 😀
Saludos
Como sumo sacerdote de la terminal , servidores y conexiones ssh acudo a ti,oh gran KZKG^Gaara, y te pregunto:dónde puedo conseguir un tutorial al nivel de mi ignorancia que me permita usar conexiones ssh entre dos maquinas remotas en distintas redes para compartir archivos de texto ,pdf ,imagen y sonido(mp3)….
🙂
Ya en serio,me podrías guiar al respecto,tengo dos máquinas,una en el trabajo y otra en casa y necesito una conexión ssh entre ambas(porque según entiendo ssh permite compartir contenido entre máquinas,¿o me equivoco?).
Y si me equivoco,que aplicación me recomiendas?
Y dónde encuentro un tuto básico al respecto?
scp.
scp usuario@direccion_maquina:ruta usuario@direccion_maquina:ruta.
Misma sintaxis que cp, origen -> destino.
Apareciste hombre, estabas perdido.
Buen Tip!
Interesante tip… xD
por casualidad no conoceran alguno que haga resaltar texto en negrita?
osea tengo un archivo txt que es un diccionario tiene mas de 10000 lineas y quiero que resalte determinado texto antes de «:» los puntos suspencivos y hacerlo uno por uno es demasiado.
Hola,
Un archivo txt es de texto plano, como su nombre lo indica … plano, sin formatos ni nada similar, lo siento pero creo que lo que pides no se puede hacer o si? 🙁
Saludos
en realidad si se puede, pero habría que saber el formato destino.
pe:
echo $(echo «Robert: Hola. Cambio aquí»|sed ‘s/\./.\\e[40;31m/;s/\:/:\\e[40;35m/’)
es cuestión de apañarse.
lo otra forma de borrar que se puede usar es sed ‘/’$1’/d’ pero hay que estar seguro de la re.
pues termine de guardarlo en *.odt
No habra una forma mas sencilla de hacerlo con LibreOffice?
¿Se podría borrar parte de una línea y dejar el resto?
Digamos que quiero borrar todo lo que hay delante de una palabra en una determinada fila.
O bien borrar todo lo que siguie a esa palabra.
Si, es cuestión de tirar de una regex (si es necesario man sed -r, –regexp-extended)
Partiendo de que encuentro
echo «Robert: Hola. Cambio aquí» | sed ‘s/Cambio//’
con un patrón bien definido y con . (un caracter) y * (mas de uno)
Después:
echo «Robert: Hola. Cambio aquí» | sed ‘s/Cambio.*//’
Antes:
echo «Robert: Hola. Cambio aquí» | sed ‘s/.*Cambio//’
Si importa que aparezca la palabra
echo «Robert: Hola. Cambio aquí» | sed ‘s/Cambio.*/Cambio/’
o mas rebuscado
en la linea que contenga Robert lo que va después de Cambio
echo -e «Fritz: Hola. Cambio aquí\nRobert: Hola. Cambio aquí» | sed ‘/Robert/s/Cambio.*//’
o como al principio sacar la segunda linea y procesar el resto
echo -e «Fritz: Hola. Cambio aquí\nRobert: Hola. Cambio aquí\nOtra» | sed -e 2d -e ‘s/Cambio.*//’
echo -e «Fritz: Hola. Cambio aquí\nRobert: Hola. Cambio aquí\nOtra» | sed ‘2d;s/Cambio.*//’
Gracias, me es muy útil.
Lindo artículo, de los que a mi me gustan, que grande el SysAdmin!
Qué sería de nuestra vida sin sed, awek, perl, grep, tail, head, «Emacs» y tantas otras herramientas imprescindibles!?
Gracias, fue de mucha ayuda.
Buenas, y como se podría hacer para borrar de un fichero la línea 1,4 y 10 en el mismo comando?