Shell脚本:截断字符串

时间:2012-08-12 17:28:47

标签: string shell

我有两个充满训练和相应测试文件的文件夹,我想使用shell脚本相互运行拟合对。

这是我到目前为止所做的:

for x in SpanishLS.train/*.train
do
    timbl -f $x -t SpanishLS.test/$x.test
done

这应该在一个目录中取file1(-n).train,在另一个目录中查找file1(-n).test,然后通过名为timbl的工具运行它们。 它的作用是寻找一个名为SpanishLS.train/file1(-n).train.test的文件,当然不存在。 我尝试做的事情无济于事,是以允许脚本找到正确文件的方式截断$x,但每当我执行此操作时,$x过早被截断,导致脚本甚至找不到.train文件。

我该如何编码?

3 个答案:

答案 0 :(得分:4)

如果我找对你,这将完成这项工作:

for x in SpanishLS.train/*.train
do
    y=${x##*/}  # strip basepath
    y=${y%.*} # strip extention
    timbl -f $x -t SpanishLS.test/$y.test
done

答案 1 :(得分:2)

使用basename

for x in SpanishLS.train/*.train
do
    timbl -f $x -t SpanishLS.test/$(basename "$x" .train).test
done

.train中删除目录前缀和$x后缀,并建立您想要的名称。

bash(以及其他POSIX-compliant shells)中,您可以使用两个shell parameter expansions执行basename操作,而无需调用外部程序。 (我认为没有办法将两个扩展合并为一个。)

for x in SpanishLS.train/*.train
do
    y=${x##*/}                                        # Remove path prefix
    timbl -f $x -t SpanishLS.test/${y%.train}.test    # Remove .train suffix
done

注意:bash支持很多(有用的)扩展,这些扩展不是由POSIX定义的。例如,${y//.train/.test}bash - 仅表示法(或bash和兼容的贝壳表示法)。

答案 2 :(得分:0)

将文件名中出现的所有.train替换为.text

timbl -f $x -t $(echo $x | sed 's/\.train/.text/g')