重命名文件在 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_文件名,但我想将该tokenized部分重命名为sampa,以便新文件看起来像randomnumber_sampa.txt.

奇怪的是,虽然最后文件没有被调用randomnumber_sampa.txt,但是randomnumber_samaaaaaa.txt

我怀疑这要么是 tcsh 的问题,要么是命令的问题setenv

我究竟做错了什么?

答案1

您面临的直接问题是它tr没有按照您的想法行事。tr施行特点替换,而不是字符串替换。该命令tr "tokenized" "sampa"替换tby soby akby m、(ebyp被后续出现的e)、and nizebyd替换a

要执行字符串替换,您可以使用 sed。但这有点不方便,而且很难做到正确。对于简单的字符串操作,请使用 shell 的字符串操作结构而不是外部工具。

Tcsh 缺乏字符串操作结构。但在过去 20 年左右的时间里,(t)csh 并不是一级命令行 shell,而且从来都不适合编写脚本。只是不要编写 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

相关内容