我试图在没有扩展名的情况下从一个充满文件的目录中提取文件名。以下是我使用的代码:
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
因为你可以看到子串是空白的,有人知道这是为什么吗?
答案 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)
如果我了解您要做的事情,那么您就不需要awk
。 csh
具有从文件名中提取根或扩展名的内置功能。</ 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,它具有相似的功能,但它们并不那么方便。)