Renomeando arquivos dá resultado estranho no tcsh

1
#!/usr/bin/tcsh
setenv LC_ALL de_DE
rm /home/users0/me/master/me/LookupScripts/Sampa/*
foreach f ( /home/users0/me/master/me/LookupScripts/Tokenized/*.txt )
set g = "'basename $f .txt'"
set h = "'echo $g | tr "tokenized" "sampa"'"
cat $f | ./a4.lookup > Sampa/$h.txt
end

Em /home/users0/me/master/me/LookupScripts/Tokenized/ , tenho alguns arquivos .txt que são denominados randomnumber_tokenized.txt . Eu quero executar um script neles e eu quero colocar a saída do script para a pasta Sampa/ e eu quero manter randombumber_ nos nomes dos arquivos, mas eu quero renomear a parte tokenized para sampa , para que os novos arquivos pareçam com randomnumber_sampa.txt .

Estranhamente, no final, os arquivos não são chamados randomnumber_sampa.txt , mas randomnumber_samaaaaaa.txt

Eu suspeito que seja um problema com o tcsh ou seja por causa do comando setenv .

O que estou fazendo de errado?

    
por doc 31.07.2016 / 04:04

1 resposta

1

Seu problema imediato é que tr não faz o que você acha que faz. tr realiza a substituição de caractere , não a substituição de string. O comando tr "tokenized" "sampa" substitui t por s , o por a , k por m , ( e by p é substituído por uma ocorrência subseqüente de e ), e n , i , z , e e d por a .

Para executar uma substituição de string, você pode usar sed. Mas isso é um tanto inconveniente e difícil de acertar. Para manipulação simples de strings, use as construções de manipulação de strings do shell em vez de ferramentas externas.

Tcsh não possui construções de manipulação de strings. Mas (t) csh não tem sido um shell de linha de comando nível 1 nos últimos 20 anos, e nunca foi bom para o script . Apenas não escreva scripts csh.

Além disso:

  • Nunca defina LC_ALL como algo diferente de C (ou seu sinônimo POSIX ). LC_ALL substitui todas as categorias e isso pode causar problemas. Para definir um padrão para todas as categorias, use LANG . Mas nos scripts, C é geralmente o que você precisa, exceto LC_CTYPE (conjunto de caracteres) e LC_MESSAGES (mensagens para o usuário).
  • A manipulação de strings em sh é feita por meio da expansão de parâmetros .
  • O sh simples não tem nenhuma construção de substituição de strings, mas o bash faz.
  • Sempre use o dobro citações em torno de substituições de variáveis
#!/bin/bash
export LC_ALL=C
for f in /home/users0/me/master/me/LookupScripts/Tokenized/*.txt; do
  g="${f##*/}"
  h="${g//tokenized/sampa}"
  ./a4.lookup <"$f" >"Sampa/$h.txt"
end
    
por 01.08.2016 / 02:46

Tags