フルforeachコマンドの実行

フルforeachコマンドの実行

以下のように個々のコマンドをそれぞれ入力するのではなく、1行のコードでforeachループを実行しようとしています。

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

上記のように実行するのではなく、これらすべてのコマンドを1行で実行する方法はありますか?

私はtcshシェルを使用していますが、foreachがシェルでどのように機能するかについてのドキュメントを見つけるのに問題があります。

答え1

指摘したように、csh / tcshの1行でこれを行う機能はかなり制限されています。このページから:

残念ながら、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 ファイルを変更しました。"' |

関連情報