#!/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
施行特点替换,而不是字符串替换。该命令tr "tokenized" "sampa"
替换t
by s
、o
by a
、k
by m
、(e
byp
被后续出现的e
)、and n
、i
、z
和e
byd
替换a
。
要执行字符串替换,您可以使用 sed。但这有点不方便,而且很难做到正确。对于简单的字符串操作,请使用 shell 的字符串操作结构而不是外部工具。
Tcsh 缺乏字符串操作结构。但在过去 20 年左右的时间里,(t)csh 并不是一级命令行 shell,而且从来都不适合编写脚本。只是不要编写 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