Tengo un archivo de texto que tiene una línea particular algo así como
sometext sometext sometext TEXT_TO_BE_REPLACED sometext sometext sometext
Necesito reemplazar toda la línea de arriba con
This line is removed by the admin.
La palabra clave de búsqueda es TEXT_TO_BE_REPLACED
Necesito escribir un script de shell para esto. ¿Cómo puedo lograr esto usando sed
?
Respuestas:
Puede usar el comando de cambio para reemplazar toda la línea y la
-i
bandera para realizar los cambios en el lugar. Por ejemplo, usando GNU sed:fuente
c\
cuando se sigue directamente una variable:…c\$VAR…
la barra invertida escapará al dólar. En este caso, tuve que escribir (bash / sed en Ubuntu 15.10)…c\\$VAR…
sed -i '' '/TEXT_TO_BE_REPLACED/c\This line is removed by the admin.' /tmp/foo
; (cuando el primer parámetro está en blanco se edita en el archivo, de lo contrario crea una copia de seguridad)Debe usar wildards (
.*
) antes y después para reemplazar toda la línea:fuente
sed -i -e "s/.*search_string.*/Replacement_line/' file_being_searched.txt
-i
opciónLa respuesta aceptada no me funcionó por varias razones:
-i
con una extensión de longitud ceroc\
comando es extraña y no pude hacerlo funcionarAsí que aquí está la solución que se me ocurrió y creo que debería funcionar para la mayoría de los casos:
Entonces, el uso de muestra para solucionar el problema planteado:
fuente
La respuesta anterior:
Funciona bien si la cadena / línea de reemplazo no es una variable.
El problema es que en Redhat 5
\
después de lac
fuga$
. Un doble\\
tampoco funcionó (al menos en Redhat 5).A través de hit y trial, descubrí que el
\
afterc
es redundante si su cadena / línea de reemplazo es solo una línea. Entonces no lo usé\
despuésc
, usé una variable como una sola línea de reemplazo y fue una alegría.El código se vería así:
Tenga en cuenta el uso de comillas dobles en lugar de comillas simples.
fuente
Todas las respuestas proporcionadas hasta ahora suponen que usted sabe algo sobre el texto que se va a reemplazar, lo que tiene sentido, ya que eso es lo que le preguntó el OP. Le proporciono una respuesta que asume que no sabe nada sobre el texto que se va a reemplazar y que puede haber una línea separada en el archivo con el mismo contenido o contenido similar que no desea reemplazar. Además, supongo que conoce el número de línea de la línea que se va a reemplazar.
Los siguientes ejemplos demuestran la eliminación o el cambio de texto por números de línea específicos:
fuente
para la manipulación de archivos de configuración
se me ocurrió esta solución inspirada en la respuesta de skensell
configLine [searchPattern] [replaceLine] [filePath]
va a:
Función:
la magia del estado de salida loca viene de https://stackoverflow.com/a/12145797/1262663
fuente
funciona bien
fuente
En mi archivo MAKE uso esto:
PD: NO olvide que -i cambia realmente el texto en el archivo ... así que si cambia el patrón que definió como "Revisión", también cambiará el patrón para reemplazarlo.
Salida de ejemplo:
Entonces, si configura el patrón "Revisión: 1190" obviamente no es lo mismo que los definió como "Revisión:" solamente ...
fuente
El archivo find_replace contiene 2 columnas, c1 con patrón para que coincida, c2 con reemplazo, el bucle sed reemplaza cada línea que contiene uno del patrón de la variable 1
fuente
sed
una vez con un archivo de secuencia de comandos que contiene todos los reemplazos que desea realizar. Ejecutarsed -i
en el mismo archivo repetidamente es un antipatrón horrible.Es tan similar al anterior.
fuente
FOO=TEXT_TO_BE_REPLACED
aFOO=This line ...
no cumple con la especificación.El siguiente comando funciona para mí. Que está trabajando con variables
fuente
Muy a menudo uso expresiones regulares para extraer datos de archivos, solo lo usé para reemplazar la cita literal
\"
con//
nada :-)fuente