Noticias:

Surge una nueva promesa en el fútbol español: Raúl González Blanco. Los aficionados del Atlético de Madrid están de suerte.

Menú Principal

Dudas de Linux

Iniciado por Mskina, 26 de Abril de 2009, 00:19

0 Miembros y 1 Visitante están viendo este tema.

Mr Winters

¿Hay alguna forma de redimensionar las particiones de Ubuntu desde Windows o por huevos tengo que hacerlo con el LiveCD de Gparted?



Faerindel

Con algún programa para particionar a lo mejor. Pero Windows de base te permite chafar y chafar dos veces.

Orestes

De hecho que yo recuerde Windows no reconocía el ext3/ext4 así que ni se dará cuenta de que hay esas particiones.

Sorry but you are not allowed to view spoiler contents.

Orestes

A ver una dudilla de Linux... estoy intentando editar un archivo de texto desde la linea de comandos, y tengo que editar o reemplazar líneas dentro del texto, y no tengo muy claro cómo diantres hacerlo.

He probado con sed -i y funciona bastante bien siempre que sepa qué es lo que tenía el archivo antes de reemplazarlo, pero si no lo sé no sé cómo hacerlo.

La idea es editar cosas como:
default-lease-time 600;
por
default-lease-time 11000;
o
#range dynamic-bootp 10.254.239.40 10.254.239.60;
por
range dynamic-bootp 10.254.239.40 10.254.239.120;

pero no puedo saber qué es lo que había en la línea antes de poner mis datos de configuración, así que el sed solo me sirve si acaso para quitar cosas (el #, p ej) pero no para cambiar una IP desconocida por la mía.

¿Alguna idea?

Sorry but you are not allowed to view spoiler contents.

Orestes

Otra idea que se me ha ocurrido leyendo por ahí es hacer un archivo plantilla que rellenar con los datos que quiera y sobreescribir el archivo que quiero editar con la plantilla rellena, pero no sé hasta qué punto eso es pasarse de curro porque haya algo mucho más fácil.

Sorry but you are not allowed to view spoiler contents.

neoprogram

Cita de: Orestes en 05 de Mayo de 2012, 17:36
A ver una dudilla de Linux... estoy intentando editar un archivo de texto desde la linea de comandos, y tengo que editar o reemplazar líneas dentro del texto, y no tengo muy claro cómo diantres hacerlo.

He probado con sed -i y funciona bastante bien siempre que sepa qué es lo que tenía el archivo antes de reemplazarlo, pero si no lo sé no sé cómo hacerlo.

La idea es editar cosas como:
default-lease-time 600;
por
default-lease-time 11000;
o
#range dynamic-bootp 10.254.239.40 10.254.239.60;
por
range dynamic-bootp 10.254.239.40 10.254.239.120;

pero no puedo saber qué es lo que había en la línea antes de poner mis datos de configuración, así que el sed solo me sirve si acaso para quitar cosas (el #, p ej) pero no para cambiar una IP desconocida por la mía.

¿Alguna idea?

Hay varias formas de hacerlo y unas cuantas mejores que la que te puedo poner por aquí, aunque la mayoría de las que sé pasan por utilizar expresiones regulares.
Ya que has empezado con sed (podrías utilizar python, lisp o algún otro), voy a poner una posible solución con el mismo.

Para una línea como:
default-lease-time 600;
en la que supongo que el formato será algo como:
default-lease-time<separador><número>;

Su expresión regular sería:
^default-lease-time[\t ]+[0-9]+;
Donde:

  • ^ - Comienzo de línea. Sólo captura las expresiones que comiencen con default-lease-time, no líneas que tengan la expresión intercalada
  • [\t ]+ - Captura uno o más tabuladores y espacios, intercalados o no. Si sabes cúantos tabuladores o espacios hay en la expresión, lo puedes cambiar por el número concreto de los mismos si quieres.
  • [0-9]+ - Captura una o más cifras. Esto es lo que capturará el número.

Una llamada sed que aplicaría esta expresión sería:
sed -i -r 's/^(default-lease-time[\t ]+)([0-9]+);/\1NUMEROQUEQUIERAS;/' FICHEROENTRADA
Donde NUMEROQUEQUIERAS es el nuevo número y FICHEROENTRADA es el fichero de entrada. Te recomiendo que hagas una copia de seguridad o le digas a sed que la haga antes cuando pruebes el comando por si hay problemas.

Para una línea como:
#range dynamic-bootp 10.254.239.40 10.254.239.60;
en la que supongo que el formato será algo como:
#range dynamic-bootp<separador><ip>[<separador><ip>...];
Una expresión regular sería:
^#range dynamic-bootp[\t ]+([0-9]{1,3}(\.[0-9]{1,3}){3}[ \t]*)+;

Una llamada sed que aplicaría esta expresión sería:
sed -i -r 's/^#(range dynamic-bootp[\t ]+)([0-9]{1,3}(\.[0-9]{1,3}){3}[ \t]*)+;/\1IPS;/' FICHEROENTRADA
Donde IPS la lista de nuevas IPs y FICHEROENTRADA es el fichero de entrada.

Esta última quitaría la # de aquellas líneas que comiencen por #range dynamic-bootp y además reemplaza las IPs listadas por las que tú le pongas. Para que afectase a las líneas sin # o que no reemplace las IPs ya existentes, la expresión sería distinta.




たとえばここには愛すべき声があってあたしはそれすた守れなくて

Orestes


Sorry but you are not allowed to view spoiler contents.

Orestes

Vale, me he encontrado con un problema:

Estoy en medio del script y pongo

sed -i -r 's/^Timeout[\t ]+[0-9]+/Timeout $_timeout/' archivo1

para que el script inserte en archivo1 el valor de la variable _timeout cuando encuentre la línea que tiene el formato "^Timeout[\t ]+[0-9]+", pero el problema es que toda la expresión está encerrada entre comillas simples y me escribe "$_timeout" textualmente en vez del valor de la variable.

Neo, ayúdame! *.*

Sorry but you are not allowed to view spoiler contents.

neoprogram

Cita de: Orestes en 06 de Mayo de 2012, 22:05
Vale, me he encontrado con un problema:

Estoy en medio del script y pongo

sed -i -r 's/^Timeout[\t ]+[0-9]+/Timeout $_timeout/' archivo1

para que el script inserte en archivo1 el valor de la variable _timeout cuando encuentre la línea que tiene el formato "^Timeout[\t ]+[0-9]+", pero el problema es que toda la expresión está encerrada entre comillas simples y me escribe "$_timeout" textualmente en vez del valor de la variable.

Neo, ayúdame! *.*

Las comillas simples las puse por si metías caracteres que pudieran expandir. En este caso puedes cambiarlas por dobles y escapar cualquier cosa que el intérprete de comandos trate de expandir. Una expresión válida podría ser:

sed -i -r "s/^(Timeout[\t ]+)([0-9]+)/\1${_timeout}/" archivo1

Nota: estoy asumiendo que el intérprete es bash o uno que actúa de forma similar... si utilizas otro, puede que tengas que ajustar la expresión o escapar algún caracter.




たとえばここには愛すべき声があってあたしはそれすた守れなくて

Orestes

Es bash. Neo, te debo una cerveza :besiku:

Sorry but you are not allowed to view spoiler contents.