Executando um comando foreach completo

4

Estou tentando executar um loop foreach em apenas 1 linha de código, em vez de digitar cada comando indivdual, como abaixo;

Set n=0 ; foreach txt ( *_*.txt)
foreach? sed “s/_/-/g” $txt
foreach? @ n ++
foreach? End
echo You changed $n files

Existe alguma maneira de executar todos esses comandos em uma única linha, e não na maneira como é feito acima?

Estou usando o shell tcsh, mas estou com dificuldades para encontrar qualquer documentação sobre como o foreach pode funcionar dentro do shell.

    
por r0bb077 27.02.2012 / 22:17

2 respostas

3

A capacidade de fazer isso em uma linha no csh / tcsh é um pouco limitada, como apontado neste documento. página :

Unfortunately, the csh does not allow the use of ';' in place of new-line characters at the start of a loop, such as:

foreach fn ( * ) ; file $fn ; end <- This doesn't work

In this case, it is necessary to resort to more indirect methods.

alias check_ultras '(echo "foreach host ( tlsc0{1,2,3,4} ) " ; echo "echo :::: "\$"host :::: " ; echo "rsh "\$"host top -n -d1 7" ; echo "end" ) | csh'

  • or -

echo "while ( 1 ) \n" "xset "{,-}"led 2; sleep 1 \n" end | csh -f

Então, no seu caso, você poderia fazer algo como:

alias change_files '(echo "set n=0; foreach txt ( *_*.txt )"; echo "sed 's/_/-/g' "\$"txt"; echo "@ n ++"; echo "end"; echo "echo You changed "\$"n files) | csh'
change_files

(ou, para evitar a criação do alias separado):

'(echo "set n=0; foreach txt ( *_*.txt )"; echo "sed 's/_/-/g' "\$"txt"; echo "@ n ++"; echo "end"; echo "echo You changed "\$"n files) | csh'

Mas você provavelmente poderia fazer isso mais facilmente de outra maneira. O que você está realmente tentando fazer - renomear os arquivos ou alterar o conteúdo desses arquivos?

    
por 27.02.2012 / 23:05
0

Tente isto:

echo 'set n = 0 \n foreach txt (_.n) \n sed "s/_/-/g" $txt \n @ n ++ \n end \n echo "You changed $n files"' | csh -f

    
por 19.10.2017 / 07:34

Tags