파일 이름을 바꾸면 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

관련 정보