字符中unix的子字符串

时间:2014-11-05 21:54:07

标签: 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/* | 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。

感谢阅读!

2 个答案:

答案 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(如上所述,可能是最简单的),awksed等等。

这样做有一个缺点,即启动外部进程,如果你没有每秒多次次,那就应该没问题。如果它需要快速,那么最好使用特定于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]