Reemplazar un patrón que contiene un apóstrofe dentro de un archivo

7

Tengo un archivo de texto que contiene esta línea:

set stime = '0 0'

Necesito cambiar eso para:

set stime = '0 4'

Intenté estos comandos:

sed -i 's/original/new/g' file.txt

y

awk '{gsub(/pattern/,"replacement")}' file 

Pero no funcionan. Supongo que se debe al apóstrofe en el patrón. ¿Cómo puedo hacer esto correctamente?

azul profundo
fuente

Respuestas:

8

Con el fin de escapar de comilla simple ', usted debe utilizar comillas dobles: ".

Para actualizar en el lugar, debe usar sed -i

El siguiente código debe actualizarse in situ y escapar de la comilla simple:

sed -i "s/set stime = '0 0'/set stime = '0 4'/g" input_file_name
Yaron
fuente
"solía escapar de comillas simples, entonces ¿no puede ser sed -i "s/4/1/g filename"?
Margarita
@Lnux Eso reemplazaría cada instancia de 4en todo el archivo 1, que no es lo que se solicitó. Además, el nombre del archivo no debe estar entre comillas; hay dos argumentos: el patrón (entre comillas para que pueda contener espacios y puntuación); y el nombre de archivo (que también puede estar entre comillas por el mismo motivo).
IMSoP
Técnicamente, nada se está "escapando" aquí; solo puede usar comillas simples porque no terminan accidentalmente la cadena antes de tiempo. Escapar sería agregar un \ delante de una cotización, que es la única forma si necesita incluir ambos tipos de cotizaciones, por ejemplosed "s/some \"double quotes\"/some 'single quotes'/g" filename
IMSoP
nombre de archivo fuera de "..solo un error de tipeo y gracias por aclaraciones técnicas
margarita
5

Tienes algunas opciones:

  1. Use comillas dobles en lugar de comillas simples para los comandos sed o awk:

    sed -i "s/set stime = '0 0'/set stime = '0 4'/g" file
    

    o

    awk "{gsub(/set stime = '0 0'/,\"set stime = '0 4'\")}1;" file 
    
  2. Guarde el patrón en una variable de shell y use comillas dobles:

    replacement="set stime = '0 4'"
    pattern="set stime = '0 0'"
    

    entonces

    sed "s/$pattern/$replacement/g" file
    

    o

    awk -vpat="$pattern" -vrep="$replacement" '{gsub(pat,rep)}1;' file 
    
  3. No uses todo el patrón. Simplemente encuentre la línea correcta y reemplace solo lo que necesita ser cambiado, evitando la cita. Por ejemplo, si solo tiene una aparición de set stime, puede hacer:

    sed '/set stime/{s/0 0/0 4/}' file 
    

    o

    awk '$1=="set" && $2=="time"{sub("0 0","0 4")}1' file
    
terdon
fuente