passando o arquivo como um parâmetro com sed e loop

3

Aqui, File1 é o modelo. Arquivo2 é um csv com 200 linhas com as colunas scriptname, jobname, templatename, location
O templatename é a coluna com no arquivo2.

É possível fazer isso abaixo. O objetivo é usar modelos diferentes (file1) para diferentes linhas no arquivo2. Qualquer ajuda é apreciada
 $ templatename Eu quero mudar com linhas de flie 2. É possível? O seguinte não está funcionando:

  • samplefile1
scriptname

statments go here

change jobname

salve na pasta de localização (já está lá)

  • arquivo de amostra2
scriptname, jobname, templatename, location

qqqtest,sew-test,/san00/test/file1, /san00/test/

qqqtest,sew-test,/san00/test/file2, /san00/test/

O que eu estou esperando é alterar o arquivo1, os modelos do arquivo2 etc. cada vez com a atualização abaixo lendo csv?

while IFS=, read scriptname jobname templatename location; 
do sed -e "s/scriptname/$scriptname/" \
  -e "s/jobname/$jobname/" $templatename > "$location" 
done < (file2) 

Como eu atualizo o $ templatename?

    
por math 08.03.2012 / 03:56

1 resposta

1

Não sei se entendi o que você quer, mas vejo várias coisas que provavelmente precisam ser corrigidas.

IFS=, read scriptname jobname templatename location lê valores separados por vírgulas. Em file2 , você parece ter espaços em branco ao redor de vírgulas. O espaço em branco terminará nas variáveis. Se nunca houver nenhum espaço em branco dentro de um campo, defina IFS=', ' para tratar qualquer sequência de uma vírgula envolvida por espaço em branco opcional ou qualquer sequência de espaço em branco como um separador. Se pode haver espaços em branco dentro dos campos, mas não no início nem no final, recomendo pré-processar file2 first:

<file2 sed -e 's/^  *//' -e 's/ *, */,/g' -e 's/  *$//' | while IFS=, read …; do …; done

A propósito, <(file2) é um erro de sintaxe em algumas shells, e em outras shells isso significa que file2 é um comando a ser executado (substituição de processo). Você quis dizer <file2 .

Se houver um / no nome do script ou no nome do trabalho, ele terminará no comando sed e causará um erro de sintaxe de sed. Como você não pode ter uma vírgula em nenhum dos campos de file2 por construção, use , como o separador de comando sed s :

sed -e "s,scriptname,$scriptname," -e 's,jobname,$jobname,' …

Em seus dados de exemplo, o local é um diretório, mas no seu código, você tenta gravar a saída nele. Se o local for um diretório, você precisará fornecer um nome de arquivo. Se você quiser usar o mesmo nome de arquivo como $templatename quando o local é um diretório, você pode fazer isso:

if [ -d "$location" ]; then
  location="$location/${templatename##*/}"
fi

Os arquivos $location e $templatename não podem ser o mesmo arquivo, caso contrário, sed … "$templatename" >"$location" primeiro truncará esse arquivo e depois começará a ler a partir dele. Para permitir a possibilidade de os arquivos serem os mesmos, grave a saída do sed em um arquivo temporário e, em seguida, mova-o para o lugar. Se você tem mkstemp :

location_dir=${location%/*}
tmp=$(TMPDIR=$location_dir mktemp -t)
sed … >"$tmp"
mv -f -- "$tmp" "$location"
    
por 08.03.2012 / 19:04