2 votos

Busque y elimine una línea que comienza con una cadena determinada en un archivo

Mi archivo tiene actualmente

 Name.      Address.   Phone number 
Jack.        L.A             1435672
John         L.A.            1465432
Nick.        F.l.            1489756
 

Cuando el usuario desea eliminar un contacto de la lista, ingresa el nombre del contacto y el programa elimina toda la línea. Cuando el usuario desea modificar un contacto, ingresa el nombre y encuentra el contacto y luego lo cambia con un nuevo nombre, dirección y número de teléfono. Estoy tratando de lograr esto usando dos funciones borrar y modificar.

2voto

Spas Spasov Puntos 305

Puede utilizar el comando sed con una sintaxis similar a como:

sed "/^\t$name/d" in-file

Donde:

  • debemos utilizar comillas dobles cuando dentro de la expresión regular es necesario pasar una variable de shell - $name en este caso.

  • ^ coincide con el comienzo de la línea.

  • \t coincide con una sola ficha.

  • el comando d al final va a eliminar cada línea que coinciden con nuestra regexp /^\t$name/.

Usted puede agregar -i (o -i.bak) para crear los cambios en el lugar de el archivo (o y crear una copia de seguridad). O usted puede Blueirect la salida de la orden para anotger archivo, etc.:

sed "/^\t$name/d" in-file -i.bak
sed "/^\t$name/d" in-file > out-file

Más ejemplos:

$ name='Blue'                       # assign a value to the shell variable $name

$ cat in-file                       # output the content of the input file
first line
second line
    Blue
    fourth line
Blue

$ sed "/^\t*$name/d" in-file        # remove the lines that begin ^ with 0 or more tabs followed by the value of $name
first line
second line
    fourth line

$ sed -r "/^\t+$name/d" in-file     # remove the lines that begin ^ with 1 or more tabs followed by the value of $name; enable extended regexp -r
first line
second line
    fourth line
Blue

$ sed -r "/^\t{0,1}$name/d" in-file # remove the lines that begin ^ with 0 or 1 tabs followed by the value of $name; enable extended regexp -r
first line
second line
    fourth line

$ sed -r "/^\t?$name/d" in-file     # remove the lines that begin ^ with 0 or 1 tabs followed by the value of $name; enable extended regexp -r
first line
second line
    fourth line

$ sed -r -e "/^(\t|\s|\s\t|\t\s)?$name/d" -e 's/^\t//' in-file # remove the lines that begin ^ with 0 or 1 tabs, or spaces, or spaces and tabs, or tabs and spaces`; remove the tabs in the beginning of the rest lines 
first line
second line
fourth line

Edit: Aquí es cómo sustituir toda una línea desde el ejemplo proporcionado en la actualización de la pregunta. Aquí se usa el sed's de sustitución de comando s/regexp/replacement/.

Primero supongamos que hemos definido los siguientes conjuntos de variables:

old_name='Jack.' old_address='L.A.' old_phone='1435672'
new_name='Tom.' new_address='F.l.' new_phone='875632'

Si necesitamos coincidencia exacta de la línea y desea mantener el formato exacto, podemos usar el siguiente comando, que utiliza la captura de la opción grupos: (...) -> \1, etc.; además, la opción -r (el uso de expresiones regulares extendidas) se aplica simplemente la sintaxis (marque esta pregunta como referencia):

sed -r "s/^(\t*|\s*)$old_name(\t*|\s*)$old_address(\t*|\s*)$old_phone(\t*|\s*)$/\1$new_name\2$new_address\3$new_phone\4/" in-file

De esta manera nos la captura de los separadores de campo (que en este caso el frío de las pestañas y/o espacios) y los de salida en su posición dentro de la cadena de reemplazo.

Si no tenemos que ser tan exacta que podemos utilizar algo más simple, ya que la siga (donde en el lugar de la captura de los grupos de la expresión regular se espera 0 o más * caracteres de cualquier tipo .):

sed -r "s/^.*$old_name.*$old_address.*$old_phone.*$/$new_name\t$new_address\t$new_phone/" in-file

O aún más simple:

sed -r "s/^.*$old_name.*$/$new_name\t$new_address\t$new_phone/" in-file

Ejemplo:

$ cat in-file 
Name.   Address.  Phone number
Jack.   L.A.      1435672               
John.   L.A.      1465432
Nick.   F.l.      1489756

$ old_name='Jack.' old_address='L.A.' old_phone='1435672' new_name='Tom.' new_address='F.l.' new_phone='875632'

$ sed -r "s/^(\t*|\s*)$old_name(\t*|\s*)$old_address(\t*|\s*)$old_phone(\t*|\s*)$/\1$new_name\2$new_address\3$new_phone\4/" in-file 
Name.   Address.  Phone number
Tom.    F.l.      875632               
John.   L.A.      1465432
Nick.   F.l.      1489756

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: