전체 foreach 명령 실행

전체 foreach 명령 실행

아래와 같이 개별 명령을 각각 입력하는 대신 단 한 줄의 코드로 foreach 루프를 실행하려고 합니다.

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

위와 같이 실행하는 대신 이 모든 명령을 한 줄로 실행할 수 있는 방법이 있습니까?

tcsh 셸을 사용하고 있는데 foreach가 셸에서 작동하는 방식에 대한 문서를 찾는 데 문제가 있습니다.

답변1

지적한 대로 csh/tcsh의 한 줄에서 이 작업을 수행하는 기능은 다소 제한되어 있습니다.이 페이지에서:

불행하게도 csh는 루프 시작 부분에 개행 문자 대신 ";"을 사용하는 것을 허용하지 않습니다. 예를 들면 다음과 같습니다.

foreach fn ( * ) ; file $fn ; end<-이건 안되네요

이 경우에는 좀 더 간접적인 접근이 필요합니다.

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

  • 또는 -

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

따라서 귀하의 경우 다음을 수행할 수 있습니다.

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

(또는 별도의 별칭을 만들지 마세요.)

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

하지만 아마도 더 쉽게 할 수 있는 다른 방법이 있을 것입니다. 실제로 무엇을 하시겠습니까? 파일 이름을 바꾸거나 해당 파일의 내용을 변경합니까?

답변2

이 시도:

echo 'set n = 0 \n foreach txt (_.n) \n sed "s/_/-/g" $txt \n @ n ++ \n end \n echo "$n 파일을 변경했습니다."' |

관련 정보