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/*

我在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


谢谢你的阅读

您可以通过调用外部程序来实现这一点,而不考虑使用的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//_*/}