Supposons $file
que la valeur d'un nom de fichier soit conservée, par exemple Dr' A.tif
. Dans la programmation bash, comment pourrais-je échapper aux guillemets simples et à tout autre caractère spécial du $file
sans supprimer le caractère spécial?
Mise à jour du 9 juillet 2014
À la demande de @Gilles , extrait de code suivant qui ne peut pas gérer Dr' A.tif
:
files=$(find /path/ -maxdepth 1 -name "*.[Pp][Dd][Ff]" -o -name "*.[Tt][Ii][Ff]")
echo "${files}" > ${TEMP_FILE}
while read file
do
newfile=$(echo "${file}" | sed 's, ,\\ ,g') ## line 1
done < ${TEMP_FILE}
Après avoir essayé la réponse de @Patrick sur line 1
, il semble fonctionner pour moi. Mais si j'ai un fichier tel que Dr\^s A.tif
, la printf
commande ne semble pas aider, elle me le montre Dr\^s\ A.tif
. Si je l'essaye manuellement sur la console comme ceci:
printf "%q" "Dr\^s A.tif"
J'aurai cette sortie:
Dr\\\^s\ A.tif
Une idée de comment gérer ça?
Réponses:
Vous pouvez utiliser la fonction
printf
intégrée%q
pour accomplir cela. Par exemple:De la documentation bash sur
printf
:la source
printf '%s' "foo"
. Vous devez d'abord comprendre le fonctionnement de l'analyse des arguments dans le shell. Voir gnu.org/software/bash/manual/bash.html#Shell-Operation # 2 se produit avant # 6.printf
et sans autres manipulationsIt doesn't have a: ""
printf
. Votre problème est que vous ne voulez pas que le shell analyse votre chaîne. Pour ce faire, vous devez transmettre votre entrée au shell de manière à ce qu'il n'essaye même pas de l'analyser. Une façon de le faire serait deread -r -p 'input: ' && printf '%q\n' "$REPLY"
fournir l'entrée lorsque vous y êtes invité.printf
. Vous devriez peut-être poser une question plutôt que de critiquer une solution qui n'a rien à voir avec votre problème.Essayer:-
ou
ou si la chaîne contient un guillemet double: -
Il y a de bons tutoriels sur l'évasion et les citations sur le net. Commencez avec celui-ci .
la source
Vous n'avez pas besoin d'échapper aux noms de fichiers que vous gérez dans un script. L'échappement n'est nécessaire que si vous souhaitez mettre un nom de fichier en tant que littéral dans un script ou passer plusieurs noms de fichier en tant que flux d'entrée unique à un autre script.
Puisque vous êtes en boucle à travers la sortie
find
, c'est l' une des façons les plus simples à (!) Gérer tous les chemins possibles :la source
rapide et (très) sale
la source
Un grand nombre de ces réponses, y compris celle la plus votée
printf "%q"
, ne fonctionneront pas dans tous les cas sans manipulation supplémentaire. Je suggérerais ce qui suit (exemple ci-dessous):cat <<EOF; 2015-11-07T03:34:41Z app[postgres.0000]: [TAG] text-search query doesn't contain lexemes: "" EOF
la source