需要将文件名的一部分捕获到变量中

需要将文件名的一部分捕获到变量中

我的目录中有一堆 CSV 文件,其名称如下:

 s_m_u_supplemental_fields_account_9_4_2015_11_26_Error.csv
 s_m_u_supplemental_fields_account_9_4_2015_12_3_Error.csv
 s_m_u_academic_status_loa_8_29_2015_0_1_Error.csv

我需要捕获“s_m_u_academic_status_loa”部分以附加到文件内的列。我在线测试了 RegEx Tester 中的表达式"s/^\(s_([^_0-9]+_)+\)\([^\.]+\.csv\)$/\1/"并捕获了我需要的内容,但由于某种原因它无法在 AIX ksh 中工作。

这是到目前为止我的脚本(AIX 6.2):

#!/bin/ksh

ls *_Error.csv | while read i
do
    echo ${i}
    edfilename = `echo ${i} |sed -e "s/^\(s_([^_0-9]+_)+\)\([^\.]+\.csv\)$/\1/"`
    echo ${edfilename}
done

答案1

到目前为止,您可以尝试这个版本的脚本

#!/bin/ksh
ls *_Error.csv | while read i
do  echo "${i}"
    edfilename=$(echo "${i}" | sed -e 's/^\(s_([^_0-9]*_)*\)\([^\.]*\.csv\)$/\1/')
    echo "${edfilename}"
done

我认为 aix sed 无法理解,+所以我将它们替换为*.如果你确实需要,+那么使用\{1,\}它可以在 aix 上运行。

一个更简单的模式就足够了:'s/\([^0-9]*\)_.*/\1/'

相关内容