ファイルの名前を変更すると、tcshに奇妙な結果が表示されます。

ファイルの名前を変更すると、tcshに奇妙な結果が表示されます。
#!/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

/home/users0/me/master/me/LookupScripts/Tokenized/という.txt名前のファイルがありますrandomnumber_tokenized.txt。そのファイルに対してスクリプトを実行し、スクリプトの出力をフォルダに入れたいと思いますSampa/。ファイル名は保持したいが、新しいファイルが次のように見えるようにセクション名を変更したいと思いrandombumber_ます。tokenizedsamparandomnumber_sampa.txt

奇妙なことは、最終ファイルが呼び出されなかったrandomnumber_sampa.txtにもかかわらずrandomnumber_samaaaaaa.txt

私はこれがtcshの問題であるか、コマンドの問題だと思いますsetenv

私は何が間違っていましたか?

ベストアンサー1

あなたが直面している即時の問題は、trあなたが望むことをしていないということです。tr実装する特徴文字列置換ではなく置換です。このコマンドは、by、by、by、(byは後続の項目で置き換えられます)、and、およびbyでtr "tokenized" "sampa"置き換えられます。tsoakmepenizeda

文字列置換を実行するには、sedを使用できます。しかし、ちょっと不便でフィットするのも難しいです。単純な文字列操作の場合は、外部ツールではなくシェルの文字列操作構成を使用してください。

Tcshには文字列操作構造はありません。しかし、過去20年ほど(t)cshは一流のコマンドラインシェルではありませんでした。スクリプトには決して適していません。。 cshスクリプトを作成しないでください。

返品:

  • (または同義語)LC_ALL以外に設定しないでください。問題を引き起こす可能性のあるすべてのカテゴリをカバーしてください。すべてのカテゴリにデフォルト値を設定するには、を使用します。ただし、スクリプトでは(文字セット)と(ユーザーに送信されるメッセージ)を除いて、通常は必要なすべてです。CPOSIXLC_ALLLANGCLC_CTYPELC_MESSAGES
  • sh の文字列演算は次のように行われます。パラメータ拡張
  • 通常のshには文字列置換構造はありませんが、bashにはあります。
  • 変数の置換には常に二重引用符を使用してください。
#!/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

おすすめ記事