我在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/* | 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。
感谢阅读!
答案 0 :(得分:1)
使用ksh模式替换替换下划线及其后的任何内容(无效删除):
echo ${myFile//_*/}
对于你的例子:
codeForCurrentFile=${myFile//_*/}
此处有更多信息(请参阅第4.5.4节):http://docstore.mik.ua/orelly/unix3/korn/ch04_05.htm
答案 1 :(得分:0)
您可以通过调用外部程序来执行此操作,无论使用何种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]