J'ai la liste de mots suivante:
name,id,3
Je dois le faire citer deux fois comme ceci:
"name,id,3"
J'ai essayé sed 's/.*/\"&\"/g'
et a obtenu:
"name,id,3
Qui n'a qu'un seul guillemet double et manque le guillemet double de fermeture.
J'ai aussi essayé awk {print "\""$1"\""}
avec exactement le même résultat. J'ai besoin d'aide.
Votre fichier d'entrée comporte des retours chariot à la fin des lignes. Vous devez utiliser dos2unix
sur le fichier pour les supprimer. Ou vous pouvez le faire:
sed 's/\(.*\)\r/"\1"/g'
ce qui supprimera le retour chariot et ajoutera les guillemets.
Utilisez-le pour diriger votre entrée vers:
sed 's/^/"/;s/$/"/'
^
est l'ancre pour le début de la ligne et $
l'ancre de fin de ligne. Avec la ligne sed
, nous remplaçons le début et la fin de la ligne par "
et "
respectivement.
Exemple:
$ echo -e "name,id,2\nname,id,3\nname,id,4"|sed 's/^/"/;s/$/"/'
"name,id,2"
"name,id,3"
"name,id,4"
sans sed
:
$ echo -e "name,id,2\nname,id,3\nname,id,4"
name,id,2
name,id,3
name,id,4
Votre fichier semble avoir des fins de ligne DOS. Dirigez-le à travers dos2unix
en premier .
Preuve:
$ cat test.txt
name,id,2
name,id,3
name,id,4
$ sed 's/^/"/;s/$/"/' test.txt
"name,id,2
"name,id,3
"name,id,4
$ cat test.txt|dos2unix|sed 's/^/"/;s/$/"/'
"name,id,2"
"name,id,3"
"name,id,4"
Vous pouvez utiliser awk au lieu de sed comme ceci:
line='name,id,3'
echo $line | awk '{printf("\"%s\"\n", $0);}'
OU encore mieux est d'utiliser BASH printf comme ceci:
printf '"%s"\n' $line
La manière la plus simple que j'ai trouvée est d'utiliser les codes HEX pour les guillemets doubles:
echo name,id,3 | awk '{print "\x22" $1 "\x22"}'
"name,id,3"
Similaire à la solution @Dennis,
Utilisation
sed 's/\(.*\)/"\1"/g'
Pas besoin de chercher '\ r', cela appliquera un guillemet double pour toutes les chaînes. Cela ne nécessite pas d'exécuter dos2unix sur le fichier d'entrée.