En determinades ocasions necessitem eliminar alguna línia en específic d'un arxiu o de diversos, per exemple, m'ha passat que he tingut tot un llistat d'arxius i necessito eliminar la línia # 27 de tots aquests (la línia # 27 és la d'una ACL , norma, regla, configuració), bé puc editar arxiu per arxiu o simplement puc aconseguir el que necessito utilitzant la comanda set i un script bash (opcional).
Però, intentem amb un sol arxiu alguna cosa simple.
Tenim l'arxiu distros-deb.txt el qual conté això:
debian
kubuntu
Archlinux
solusos
menta
O sigui, l'arxiu distros-deb.txt és en el qual posarem les distros basades en Debian, però aquí veiem que a la línia 3 està «ArchLinux», distro que evidentment no té res a veure amb Debian, per la qual cosa hem d'eliminar aquesta línia. Per eliminar la línia # 3 de aquest arxiu posarem el següent:
sed "3d" distros-deb.txt > distros-deb-ok.txt
Explicar aquesta línia és una cosa fàcil, amb set «3d» estem indicant que eliminarem la línia # 3, amb distros-deb.txt li indiquem sobre què fitxer treballar, és a dir, eliminar la línia # 3 d'aquest arxiu, fins aquí si pressionem Enter ens mostrarà el que desitgem però a la terminal, de manera que amb > Distros-deb-ok.txt estem indicant que en comptes de mostrar al terminal el resultat, que el posi en un fitxer amb aquest nom.
A que és simple?
També, podem evitar fer servir el > Distros-deb-ok.txt usant un paràmetre propi de set, El paràmetre -i
O sigui, en cas que desitgem eliminar la línia de l'arxiu i guardar-ho amb el seu mateix nom (i no en un altre arxiu) n'hi ha prou amb afegir el paràmetre -i :
sed -i "3d" distros-deb.txt
Això eliminarà la línia # 3 de distros-deb.txt i el guardarà.
Què passa si vull un rang de línies, és a dir eliminar la línia # 3 però també la # 4 i # 5? Per aconseguir això posem el rang de el 3 a el 5, és a dir:
sed -i "3,5d" distros-deb.txt
I només em mostrarà debian i kubuntu
I què si vull eliminar des de la línia 2 fins a l'última, quan no conec el total de línies?
N'hi hauria prou amb fer servir el símbol de Units - »$
sed -i "2,$d" distros-deb.txt
En cas que es desitgi eliminar des de la primera línia fins a la # 4 llavors simplement posem el valor 1 a l'inici:
sed -i "1,4d" distros-deb.txt
Això ja és sobretot, un tip bastant útil quan es vol fer scripts bash per automatitzar tasques i es necessita modificar i eliminar línies d'arxius de configuració, per modificar podem usar set o perl, així com per eliminar ja sabem com fer-ho amb set
Salutacions
Molt bona aportació 😉
gràcies
By the way, ens va arribar el teu email ara mateix et responc 😀
Salutacions
Com gran sacerdot de la terminal, servidors i connexions ssh vaig a tu, oh gran KZKG ^ Gaara, i et pregunto: on puc aconseguir un tutorial a el nivell de la meva ignorància que em permeti fer servir connexions ssh entre dues màquines remotes en diferents xarxes per compartir arxius de text, pdf, imatge i so (mp3) ....
🙂
Ja seriosament, em podries guiar el respecte, tinc dues màquines, una a la feina i una altra a casa i necessito una connexió ssh entre les dues (perquè segons entenc ssh permet compartir contingut entre màquines, o m'equivoco?).
I si m'equivoco, que aplicació em recomanes?
I on trobo un Estatut bàsic a l'respecte?
scp.
scp usuari @ direccion_maquina: ruta usuari @ direccion_maquina: ruta.
Mateixa sintaxi que cp, origen -> destinació.
Vas aparèixer home, estaves perdut.
Bon Tip!
Interessant tipus de ... xD
per casualitat no coneixeran algun que faci ressaltar text en negreta?
o sigui tinc un arxiu txt que és un diccionari té mes de 10000 línies i vull que ressalti determinat text abans de «:» els punts suspencivos i fer-ho un per un és massa.
Hola,
Un arxiu txt és de text pla, com el seu nom indica ... pla, sense formats ni res semblant, ho sento però crec que el que demanes no es pot fer o si? 🙁
Salutacions
en realitat si es pot, però caldria saber el format destí.
per exemple.:
echo $ (echo «Robert: Hola. Canvi aquí» | set 's / \ ./. \\ i [40; 31m /; s / \: /: \\ i [40; 35m /')
és qüestió de apanyar.
l'altra forma d'esborrar que es pot fer servir és set '/' $ 1 '/ d' però cal estar segur de la re.
doncs acabi de guardar-lo en * .odt
No hi haurà una forma mes senzilla de fer-ho amb LibreOffice?
Es podria esborrar part d'una línia i deixar la resta?
Diguem que vull esborrar tot el que hi ha davant d'una paraula en una determinada fila.
O bé esborrar tot el que siguie a aquesta paraula.
Si, és qüestió de tirar d'una regex (si cal man set -r, -regexp-extended)
Partint de que trobo
trobo «Robert: Hola. Canvi aquí »| set 's / Canvi //'
amb un patró ben definit i amb. (Un caràcter) i * (mes d'un)
després:
trobo «Robert: Hola. Canvi aquí »| set 's / Canvi. * //'
abans:
trobo «Robert: Hola. Canvi aquí »| set 's /.* Canvi //'
Si importa que aparegui la paraula
trobo «Robert: Hola. Canvi aquí »| set 's / Canvi. * / Canvi /'
o més rebuscat
en la línia que contingui Robert el que va després de Canvi
echo -e «Fritz: Hola. Canvi aquí \ nRobert: Hola. Canvi aquí »| set '/Robert/s/Cambio.*//'
o com a el principi treure la segona línia i processar la resta
echo -e «Fritz: Hola. Canvi aquí \ nRobert: Hola. Canvi aquí \ nOtra »| set -i 2D -i 's / Canvi. * //'
echo -e «Fritz: Hola. Canvi aquí \ nRobert: Hola. Canvi aquí \ nOtra »| set '2d; s / Canvi. * //'
Gràcies, m'és molt útil.
Lindo article, dels que a mi m'agraden, que gran el SysAdmin!
Què seria de la nostra vida sense set, awek, perl, grep, tail, head, «Emacs» i tantes altres eines imprescindibles !?
Gràcies, va ser de molta ajuda.
Bones, i com es podria fer per esborrar d'un fitxer la línia 1,4 i 10 en el mateix ordre?