Ma chaîne:

INSERT INTO tb(str) VALUES('So is there really more of you to love now? it\'s ...HB\\');

Maintenant, je dois le rendre compatible avec SQLite, donc je dois remplacer les guillemets simples par 2 guillemets simples. J'ai essayé ce script AWK mais je veux remplacer uniquement \' et non \\'.

echo "So is there really more of you to love now? it\'s ...HB\\'" | awk '{ gsub( /\57\047/, "\047\047" ); print; }'
-1
Pradeep 21 avril 2017 à 13:53

3 réponses

Meilleure réponse
kent$  cat f
it\'s ...HB\\'

kent$  sed 's/\\\\\x27/\x99/g;s/\\\x27/&\x27/g;s/\x99/\\\\\x27/g' f
it\''s ...HB\\'
  • \x27 est un guillemet simple '
  • \x99 est un caractère invisible
  • tout d'abord remplacer tout \\' par \x99
  • puis remplacez tout \' par \\'
  • enfin restaurer tout \x99 vers \\'
  • terminé

Si awk est requis pour une raison quelconque:

kent$  cat f
it\'s ...HB\\'

kent$  awk '{gsub(/\\\\\x27/,"\x99");gsub(/\\\x27/,"&\x27");gsub(/\x99/,"\\\\\x27")}7' f
it\''s ...HB\\'
3
Kent 21 avril 2017 à 12:27

Approche alternative sed :

s="So is there really more of you to love now? it\'s ...HB\\'"
echo $s | sed "s/\([^\][\]\)'/\1''/g"

Le résultat:

So is there really more of you to love now? it\''s ...HB\''
0
RomanPerekhrest 21 avril 2017 à 11:10

Emprunter le fichier d'entrée d'exemple de @ Kent:

$ cat file
it\'s ...HB\\'

Votre question n'est pas claire car vous n'avez pas fourni la sortie attendue mais pour doubler les échappements:

$ awk '{gsub(/\\\\\047/,"\n"); gsub(/\n|\\\047/,"\\\\\047")} 1' file
it\\'s ...HB\\'

Et pour doubler les guillemets:

$ awk '{gsub(/\\\\\047/,"\n"); gsub(/\\\047/,"&\047"); gsub(/\n/,"\\\\\047")} 1' file
it\''s ...HB\\'

Et pour changer \' en '':

$ awk '{gsub(/\\\\/,"\n"); gsub(/\\\047/,"\047\047"); gsub(/\n/,"\\\\")} 1' file
it''s ...HB\\'

Cela fonctionnera quels que soient les caractères présents dans votre fichier d'entrée car il utilise une nouvelle ligne comme remplacement temporaire \\' et une nouvelle ligne ne peut évidemment pas être présente dans la ligne, vous SAVEZ donc qu'elle peut être utilisée en toute sécurité comme valeur temporaire .

0
Ed Morton 21 avril 2017 à 16:19