web-dev-qa-db-fra.com

Remplacer un motif contenant une apostrophe dans un fichier

J'ai un fichier texte qui contient cette ligne:

set stime = '0 0'

Je dois changer cela pour:

set stime = '0 4'

J'ai essayé ces commandes:

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

et

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

mais ils ne travaillent pas. Je suppose que c'est à cause de l'apostrophe dans le motif. Comment puis-je faire cela correctement?

7
deepblue

Pour éviter les guillemets simples ', vous devez utiliser des guillemets doubles: ".

Pour mettre à jour sur place, vous devez utiliser sed -i

Le code suivant devrait mettre à jour sur place et échapper à la citation simple:

sed -i "s/set stime = '0 0'/set stime = '0 4'/g" input_file_name
8
Yaron

Vous avez quelques choix:

  1. Utilisez des guillemets doubles au lieu de guillemets simples pour les commandes sed ou awk:

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

    ou

    awk "{gsub(/set stime = '0 0'/,\"set stime = '0 4'\")}1;" file 
    
  2. Enregistrez le modèle dans une variable Shell et utilisez des guillemets:

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

    ensuite

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

    ou

    awk -vpat="$pattern" -vrep="$replacement" '{gsub(pat,rep)}1;' file 
    
  3. Ne pas utiliser le motif entier. Il suffit de trouver la bonne ligne et de ne remplacer que ce qui doit être changé, en évitant le devis. Par exemple, si vous n'avez qu'une seule occurrence de set stime, vous pouvez faire:

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

    ou

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