string - variable - replace character linux
Reemplace toda la lĂnea que contiene una cadena usando Sed (10)
Tengo un archivo de texto que tiene una línea en 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
?
Debe usar comodines ( .*
) Antes y después para reemplazar toda la línea:
sed ''s/.*TEXT_TO_BE_REPLACED.*/This line is removed by the admin./''
En mi makefile utilizo esto:
@sed -i ''/.*Revision:.*/c/'"`svn info -R main.cpp | awk ''/^Rev/''`"'''' README.md
PD: NO olvide que -i cambia realmente el texto en el archivo ... por lo tanto, si el patrón que definió como "Revisión" cambiará, también cambiará el patrón a reemplazar.
Ejemplo de salida:
Proyecto Abc escrito por John Doe
Revisión: 1190
Entonces, si configura el patrón "Revisión: 1190", obviamente no es lo mismo que lo definió como "Revisión:" solo ...
Es similar a la anterior.
sed ''s/[A-Za-z0-9]*TEXT_TO_BE_REPLACED.[A-Za-z0-9]*/This line is removed by the admin./''
La respuesta aceptada no me funcionó por varias razones:
- Mi versión de sed no le gusta
-i
con una extensión de longitud cero - la sintaxis del comando
c/
es rara y no pude hacer que funcionara - No me di cuenta de que algunos de mis problemas provienen de barras no escapadas
Así que aquí está la solución que se me ocurrió y creo que debería funcionar en la mayoría de los casos:
function escape_slashes {
sed ''s/////////g''
}
function change_line {
local OLD_LINE_PATTERN=$1; shift
local NEW_LINE=$1; shift
local FILE=$1
local NEW=$(echo "${NEW_LINE}" | escape_slashes)
sed -i .bak ''/''"${OLD_LINE_PATTERN}"''/s/.*/''"${NEW}"''/'' "${FILE}"
mv "${FILE}.bak" /tmp/
}
Así que el uso de la muestra para solucionar el problema planteado:
change_line "TEXT_TO_BE_REPLACED" "This line is removed by the admin." yourFile
La respuesta anterior:
sed -i ''/TEXT_TO_BE_REPLACED/c/This line is removed by the admin.'' /tmp/foo
Funciona bien si la cadena / línea de reemplazo no es una variable.
El problema es que en Redhat 5 el /
después de la c
escapa el $
. Un doble //
tampoco funcionó (al menos en Redhat 5).
Mediante el golpe y la prueba, descubrí que /
después de la c
es redundante si su cadena / línea de reemplazo es solo una línea. Así que no usé /
después de la c
, usé una variable como una sola línea de reemplazo y fue una alegría.
El código se vería algo así como:
sed -i "/TEXT_TO_BE_REPLACED/c $REPLACEMENT_TEXT_STRING" /tmp/foo
Tenga en cuenta el uso de comillas dobles en lugar de comillas simples.
Muy a menudo uso expresiones regulares para extraer datos de archivos, solo lo utilicé para reemplazar la cita literal /"
con //
nada :-)
cat file.csv | egrep ''^/"([0-9]{1,3}/.[0-9]{1,3}/.)'' | sed s//"//g | cut -d, -f1 > list.txt
Puede usar el comando de cambio para reemplazar toda la línea y el indicador -i
para realizar los cambios en el lugar. Por ejemplo, usando GNU sed:
sed -i ''/TEXT_TO_BE_REPLACED/c/This line is removed by the admin.'' /tmp/foo
Todas las respuestas proporcionadas hasta ahora asumen que usted sabe algo sobre el texto que se va a reemplazar, lo cual tiene sentido, ya que eso es lo que pidió el OP. Le ofrezco una respuesta que presupone 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 que se reemplace. 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 cambio de texto por números de línea específicos:
# replace line 17 with some replacement text and make changes in file (-i switch)
# the "-i" switch indicates that we want to change the file. Leave it out if you''d
# just like to see the potential changes output to the terminal window.
# "17s" indicates that we''re searching line 17
# ".*" indicates that we want to change the text of the entire line
# "REPLACEMENT-TEXT" is the new text to put on that line
# "PATH-TO-FILE" tells us what file to operate on
sed -i ''17s/.*/REPLACEMENT-TEXT/'' PATH-TO-FILE
# replace specific text on line 3
sed -i ''3s/TEXT-TO-REPLACE/REPLACEMENT-TEXT/''
bash-4.1$ new_db_host="DB_HOSTNAME=good replaced with 122.334.567.90"
bash-4.1$
bash-4.1$ sed -i "/DB_HOST/c $new_db_host" test4sed
vim test4sed
''
''
''
DB_HOSTNAME=good replaced with 122.334.567.90
''
funciona bien
cat find_replace | while read pattern replacement ; do
sed -i "/${pattern}/c ${replacement}" file
done
El archivo find_replace contiene 2 columnas, c1 con patrón para coincidir, c2 con reemplazo, el bucle sed reemplaza cada línea que contiene uno del patrón de la variable 1