Supondo $file
que o valor de um nome de arquivo seja mantido, digamos Dr' A.tif
. Na programação do bash, como eu poderia escapar de aspas simples e qualquer outro caractere especial do $file
sem remover o caractere especial?
Atualização em 9 de julho de 2014
A pedido do @Gilles , a seguir trecho de código que não pode manipular 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}
Depois de eu ter tentado a resposta do @Patrick on line 1
, parece trabalhar para mim. Mas se eu tiver um arquivo como Dr\^s A.tif
, printf
comando não parece ajudar, isso me mostra Dr\^s\ A.tif
. Se eu tentar manualmente no console assim:
printf "%q" "Dr\^s A.tif"
Vou ter esta saída:
Dr\\\^s\ A.tif
Alguma idéia de como lidar com isso?
Respostas:
Você pode usar o
printf
built-in%q
para fazer isso. Por exemplo:A partir da documentação do bash
printf
:fonte
printf '%s' "foo"
. Você precisa entender como a análise de argumentos funciona primeiro no shell. Veja gnu.org/software/bash/manual/bash.html#Shell-Operation # 2 acontece antes da # 6.printf
e sem outras manipulaçõesIt doesn't have a: ""
printf
. Seu problema é que você não deseja que o shell analise sua string. Para fazer isso, você precisa passar sua entrada para o shell de uma maneira que nem tente analisá-lo. Uma maneira de fazer isso seriaread -r -p 'input: ' && printf '%q\n' "$REPLY"
e fornecer a entrada quando solicitado.printf
. Talvez você deva fazer uma pergunta em vez de criticar uma solução que não tem nada a ver com o seu problema.Experimentar:-
ou
ou se a string contiver aspas duplas: -
Existem bons tutoriais sobre como escapar e citar na rede. Comece com este .
fonte
Você não precisa escapar de nenhum nome de arquivo que esteja manipulando em um script. O escape só é necessário se você deseja colocar um nome de arquivo como literal em um script ou passar vários nomes de arquivo como um único fluxo de entrada para outro script.
Como você está percorrendo a saída de
find
, esta é uma das maneiras mais simples (!) De lidar com todos os caminhos possíveis :fonte
rápido e (muito) sujo
fonte
Muitas dessas respostas, incluindo a mais votada
printf "%q"
, não funcionarão em todos os casos sem manipulação adicional. Eu sugeriria o seguinte (exemplo abaixo):cat <<EOF; 2015-11-07T03:34:41Z app[postgres.0000]: [TAG] text-search query doesn't contain lexemes: "" EOF
fonte