En certas ocasións necesitamos eliminar unha liña específica dun ficheiro ou varias, por exemplo, sucedeume que tiven unha lista completa de ficheiros e que teño que eliminar a liña # 27 de todos estes (a liña # 27 é a dunha ACL , norma, regra, configuración), podo editar ficheiro por ficheiro ou simplemente podo conseguir o que necesito usando o comando sed e un script bash (opcional).
Pero, imos probar un único ficheiro un tanto sinxelo.
Temos o arquivo distros-deb.txt que contén isto:
debian
ubuntu
Archlinux
solos
menta
Noutras palabras, o ficheiro distros-deb.txt é no que poñeremos as distros baseadas en Debian, pero alí vemos que na liña # 3 hai "archlinux", unha distro que obviamente non ten nada que ver con Debian, polo que debemos eliminar esa liña. Para eliminar a liña # 3 dese ficheiro poñeremos o seguinte:
sed "3d" distros-deb.txt > distros-deb-ok.txt
Explicar esta liña é algo sinxelo, con sedento "3d" estamos indicando que eliminaremos a liña # 3, con distros-deb.txt Indicamos en que ficheiro traballar, é dicir, eliminar a liña # 3 deste ficheiro, ata aquí se prememos Intro mostraranos o que queremos pero no terminal, así que con > distros-deb-ok.txt estamos indicando que en vez de amosar o resultado en terminal, que o puxo nun ficheiro con este nome.
Que é sinxelo?
Ademais, podemos evitar usar o > distros-deb-ok.txt empregando un parámetro axeitado de sed, o parámetro -i
É dicir, no caso de que queiramos eliminar a liña do ficheiro e gardala co mesmo nome (e non noutro ficheiro), simplemente engade o parámetro -i :
sed -i "3d" distros-deb.txt
Isto eliminará a liña # 3 de distros-deb.txt e gardaraa.
E se quero un rango de liñas, é dicir, eliminar a liña # 3 pero tamén a # 4 e a # 5? Para conseguilo poñemos o rango de 3 a 5, é dicir:
sed -i "3,5d" distros-deb.txt
E só me amosará debian e kubuntu 😀
Entón, e se quero eliminar da liña 2 á última cando non sei as liñas totais?
Simplemente use o símbolo do dólar - »$
sed -i "2,$d" distros-deb.txt
No caso de que queira eliminar da primeira liña ao # 4, simplemente poñemos o valor 1 ao comezo:
sed -i "1,4d" distros-deb.txt
Isto foi todo, un consello moi útil cando queres facer scripts bash para automatizar tarefas e necesitas modificar e eliminar liñas de ficheiros de configuración, para modificar podemos usar sed o perla, así como eliminar xa sabemos como facelo con sed 😉
lembranzas
16 comentarios, deixa os teus
Moi boa contribución 😉
Grazas
Por certo, recibimos o teu correo electrónico agora mesmo che responderei 😀
lembranzas
Como sumo sacerdote do terminal, servidores e conexións ssh veño a vostede, oh KZKG ^ Gaara, e pregúntolle: onde podo obter un tutorial a nivel da miña ignorancia que me permita usar conexións ssh entre dúas máquinas remotas en redes diferentes para compartir ficheiros de texto, pdf, imaxe e son (mp3)….
🙂
En serio, podería orientarme a este respecto, teño dúas máquinas, unha no traballo e outra na casa e necesito unha conexión ssh entre ambas (porque tal e como o entendo, ssh permite compartir contido entre máquinas, ¿non si?).
E se me equivoco, que aplicación recomendas?
E onde atopo un tutorial básico ao respecto?
scp
scp usuario @ máquina_dirección: camiño usuario @ máquina_dirección: camiño.
A mesma sintaxe que cp, fonte -> destino.
Presentaches home, estabas perdido.
Bo consello!
Consello interesante ... xD
por casualidade non coñeces a un que faga destacar o texto en negrita?
Quero dicir, teño un ficheiro txt que é un dicionario, ten máis de 10000 liñas e quero que resalte certo texto antes dos puntos de suspensión ":" e facelo un por un é demasiado.
Ola,
Un ficheiro txt é un texto sinxelo, como o nome indica ... sinxelo, sen formatos nin nada similar, síntoo pero creo que o que pides non se pode facer, non si? 🙁
lembranzas
en realidade pode, pero tería que coñecer o formato de destino.
por exemplo:
echo $ (echo "Robert: Ola. Cambia aquí" | sed 's / \ ./. \\ e [40; 31m /; s / \: /: \\ e [40; 35m /')
é cuestión de facer fronte.
a outra forma de eliminar que se pode usar é sed '/' $ 1 '/ d', pero ten que estar seguro do re.
logo remate de gardalo en * .odt
Non hai un xeito máis sinxelo de facelo con LibreOffice?
¿Podería eliminar parte dunha liña e deixar o resto?
Digamos que quero eliminar todo diante dunha palabra nunha fila determinada.
Ou elimina todo o que segue a esa palabra.
Si, trátase de tirar dunha regla (se é necesario man sed -r, –regexp-Extended)
Partindo do que atopo
eco «Robert: Ola. Cambia aquí »| sed 's / Cambiar //'
cun patrón ben definido e con. (un carácter) e * (máis dun)
Despois:
eco «Robert: Ola. Cambia aquí »| sed 's / Change. * //'
Antes:
eco «Robert: Ola. Cambia aquí »| sed 's /. * Cambiar //'
Se importa que apareza a palabra
eco «Robert: Ola. Cambia aquí »| sed 's / Cambiar. * / Cambiar /'
ou máis elaborado
na liña que contén a Robert o que vai despois de Cambiar
eco -e «Fritz: Ola. Cambia aquí \ nRobert: Ola. Cambia aquí »| sed '/Robert/s/Cambio.*//'
ou como ao principio saca a segunda liña e procesa o resto
eco -e «Fritz: Ola. Cambia aquí \ nRobert: Ola. Cambia aquí \ nOutro »| sed -e 2d -e 's / Cambiar. * //'
eco -e «Fritz: Ola. Cambia aquí \ nRobert: Ola. Cambia aquí \ nOutro »| sed '2d; s / Change. * //'
Grazas, é moi útil para min.
Bo artigo, un dos que me gusta, que xenial é SysAdmin!
Que sería da nosa vida sen sed, awek, perl, grep, tail, head, "Emacs" e tantas outras ferramentas esenciais?
Grazas, foi moi útil.
Ola, e como podería eliminar as liñas 1,4 e 10 do mesmo comando dun ficheiro?