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 workIn 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?