Como escapar de espaços etc na variável passada, para chamada de sistema para cp no awk

4

Esse problema tem camadas de complexidade suficientes para tornar os simples caracteres de escape difíceis para mim. Eu tenho um script bash que, em grande parte, tem um script awk incorporado que lê um arquivo delimitado por ponto e vírgula. Neste arquivo de texto, um dos campos é um caminho de diretório para alguns JPEGs. Eu gostaria de copiar os JPEGs em outro lugar, mas o caminho do diretório original tem espaços (e poderia ter outras strings que poderiam causar danos). Eu não posso me referir ao diretório em questão com aspas simples porque isso para o interpretador awk, e as aspas duplas o transformam em uma string literal no awk.

Estou usando o gawk 4.1.1. Aqui está um código awk do que estou tentando realizar:

imageDirectory = $1;
cpJpegVariable="cp -r " imageDirectory " assets";
#screws up if imageDirectory has spaces and other naughty characters
system(cpJpegVariable);
    
por Escher 05.08.2014 / 10:11

3 respostas

5

Você pode usar:

awk '...
    cpJpegVariable="cp -r '\''" imageDirectory "'\'' assets";
    ...'

(observe que ' não precisa escapar para awk , mas você precisa de '\'' para o shell). Então, quando awk expande a variável cpJpegVariable , parece que:

cp -r 'file_contain space' assets

Com isso, você pode evitar problemas com todos os caracteres especiais, exceto ' em si. Se imageDirectory puder conter caracteres de aspas simples, você poderá evitá-los com gsub() . Exemplo:

awk '{gsub("'\''","'\''\"'\''\"",imageDirectory)}1'
    
por 05.08.2014 / 10:20
1

Se você está passando uma variável Awk para system , você precisa fazer um shell para citá-la:

function quote(str,   d, m, x, y, z) {
  d = ""; m = split(str, x, d)
  for (y in x) z = z d x[y] d (y < m ? "\" d : "")
  return z
}

Exemplo:

system(sprintf("cp -r %s assets", quote($1)))

Fonte

    
por 15.01.2017 / 07:57
0

A execução de comandos externos destina-se ao shell, não ao awk:

while read image_dir __; do
    cp -r "$image_dir" assets
done < file
    
por 05.08.2014 / 10:23