C Shell中的子串不按预期工作

时间:2015-02-07 21:33:14

标签: shell csh

我试图在没有扩展名的情况下从一个充满文件的目录中提取文件名。以下是我使用的代码:

foreach file (*)
     set extPos=`echo $file | awk '{print index($0,".")}'`
     set fname = `echo $file | awk '{print substr($0,0,$extPos)}'`
     echo $file
     echo $extPos
     echo $fname
end

这些是我收到的结果:

hodorrr.png
8

testfile1.txt
10

testfile2.txt
10

testfile3.txt
10

wtf.tiff
4

因为你可以看到子串是空白的,有人知道这是为什么吗?

2 个答案:

答案 0 :(得分:1)

substr的使用可能令人困惑,并且与其他版本的substr不一致。

要解决您的问题,请尝试

set fname = `echo $file | awk '{print substr($0,1,'"$extPos"')}'`

要消除使用多个流程的$ extPos的相对昂贵的计算,您可以使用

在1个awk进程中从fname获得file
file=testfile1.txt
#not needed set extPos=`echo $file | awk '{print index($0,".")}'`
set fname = `echo $file | awk '{print substr($0,1,index($0,".")-1)}'`

echo "fname=" $fname
testfile1

请注意,substr不会使用0作为字符串中第一个位置的地址(但使用1(谢谢awk诸神!;-) AND您可以在另一个函数的参数列表中嵌套函数调用(如index())。


当然,像朋友不要让csh中的朋友代码这样的常见警告仍然适用,但有时候组织惯性太难以克服了!

IHTH

答案 1 :(得分:1)

如果我了解您要做的事情,那么您就不需要awkcsh具有从文件名中提取根或扩展名的内置功能。<​​/ p>

% foreach file ( this.txt that.dat another.blah )
foreach? echo "file = '$file', root = '$file:r', extension = '$file:e'"
foreach? end
file = 'this.txt', root = 'this', extension = 'txt'
file = 'that.dat', root = 'that', extension = 'dat'
file = 'another.blah', root = 'another', extension = 'blah'
%

修饰符记录在历史记录替换下的tcsh手册页中,但它们也适用于变量替换。

(如果您决定切换到bash,它具有相似的功能,但它们并不那么方便。)