#!/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_
싶습니다 .tokenized
sampa
randomnumber_sampa.txt
이상한 점은 최종 파일이 호출되지 않았음에도 불구 randomnumber_sampa.txt
하고randomnumber_samaaaaaa.txt
나는 이것이 tcsh 문제이거나 명령 문제라고 생각합니다 setenv
.
내가 뭘 잘못했나요?
답변1
당신이 직면하고 있는 즉각적인 문제는 tr
당신이 원하는 것을 하고 있지 않다는 것입니다. tr
구현하다특징문자열 교체가 아닌 교체입니다. 이 명령은 by , by , by , ( by 는 후속 항목 으로 대체됨 ), and , 및 by 로 tr "tokenized" "sampa"
대체됩니다 .t
s
o
a
k
m
e
p
e
n
i
z
e
d
a
문자열 교체를 수행하려면 sed를 사용할 수 있습니다. 하지만 좀 불편하고 맞추기도 어렵습니다. 간단한 문자열 조작의 경우 외부 도구보다는 셸의 문자열 조작 구성을 사용하십시오.
Tcsh에는 문자열 조작 구조가 없습니다. 그러나 지난 20년 정도 동안 (t)csh는 일류 명령줄 셸이 아니었습니다.스크립팅에는 결코 적합하지 않습니다.. csh 스크립트를 작성하지 마십시오.
반품:
- (또는 동의어)
LC_ALL
이외의 것으로 설정하지 마십시오. 문제를 일으킬 수 있는 모든 카테고리를 다루세요. 모든 카테고리에 기본값을 설정하려면 를 사용하세요. 그러나 스크립트에서는 (문자 세트) 및 (사용자에게 보내는 메시지)를 제외하고 일반적으로 필요한 전부입니다.C
POSIX
LC_ALL
LANG
C
LC_CTYPE
LC_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