unix中字符上的子字符串
我在unix中的目录中有以下文件名:unix中字符上的子字符串,unix,Unix,我在unix中的目录中有以下文件名: code1_abc.txt code2_xyz.txt code1_pqr.txt 我在该控制器中循环浏览所有文件,对每个文件执行一些操作: for myFile in $(ls $INPUT_DIR/* | xargs -n 1 basename) do echo $myFile done 但是,现在我想拆分文件名,并希望得到下划线之前的部分,即code1、code2、code3 for myFile in $(ls $INPUT_DIR/*
code1_abc.txt
code2_xyz.txt
code1_pqr.txt
我在该控制器中循环浏览所有文件,对每个文件执行一些操作:
for myFile in $(ls $INPUT_DIR/* | xargs -n 1 basename)
do
echo $myFile
done
但是,现在我想拆分文件名,并希望得到下划线之前的部分,即code1、code2、code3
for myFile in $(ls $INPUT_DIR/* | xargs -n 1 basename)
do
echo $myFile
codeForCurrentFile= // want code1 here using myFile value
echo $codeForCurrentFile // should echo code1, code2, code3 respectively
done
如何做到这一点?我正在使用korn shell
谢谢你的阅读 您可以通过调用外部程序来实现这一点,而不考虑使用的shell(当然前提是它支持外部程序的输出捕获),例如使用以下脚本:
pax$ fspec=code1_abc
pax$ echo $fspec
code1_abc
pax$ pre=`echo $fspec | cut -d_ -f1` ; echo $pre
code1
pax$ post=`echo $fspec | cut -d_ -f2` ; echo $post
abc
您可以使用多种工具来实现此目的,cut
(如上所述,可能是最简单的工具)、awk
、sed
等等
这样做的缺点是启动外部进程,如果你每秒不做很多次,这应该是可以的。如果需要快速完成,最好使用特定于shell的内部方法,例如:
ksh:
fspec=code1_abc
pre=${fspec//_*/}
post=${fspec//*_/}
bash:
fspec=code1_abc
pre=${fspec%%_*}
post=${fspec#*_}
csh:
set fspec = code1_abc
set arr = ( $fspec:as/_/ / )
set pre = $arr[1]
set post = $arr[2]
使用ksh模式替换将下划线及其后的任何内容替换为零(有效删除): 例如:
codeForCurrentFile=${myFile//_*/}
更多信息(见第4.5.4节):
codeForCurrentFile=${myFile//_*/}