我是shell脚本的新手。我需要将以下文件结构拆分为文件名单独和文件夹路径分开。 在文件名中,我不需要_ABF1_6,因为它不是文件名的一部分。此_ABF1_6也从文件路径更改为路径,并且对于所有文件路径都不相同。所以这需要被视为正则表达式_开始使用_ABF1。请帮忙!!
示例文件路径:
/EBF/DirectiveFiles/data_report_PD_import_script_ABF1_6
需要输出:
Folder path: /EBF/DirectiveFiles/
Filename: data_report_PD_import_script
答案 0 :(得分:14)
Linux因此有特殊的实用工具,basename
和dirname
:
$ basename /EBF/DirectiveFiles/data_report_PD_import_script_ABF1_6
data_report_PD_import_script_ABF1_6
$ dirname /EBF/DirectiveFiles/data_report_PD_import_script_ABF1_6
/EBF/DirectiveFiles
答案 1 :(得分:5)
UNIX没有“文件夹”,它有“目录”。
$ cat file
/ECMS/EDEV/ClassicClient/Forms/DirectiveFiles/data_report_PD_import_script_rev1_46_2_16
$ sed -r 's/(.*\/)(.*)_rev1.*/Directory: \1\nFilename: \2/' file
Directory: /ECMS/EDEV/ClassicClient/Forms/DirectiveFiles/
Filename: data_report_PD_import_script
或使用GNU awk(对于gensub()),如果您愿意:
$ gawk '{print gensub(/(.*\/)(.*)_rev1.*/,"Directory: \\1\nFilename: \\2","")}' file
Directory: /ECMS/EDEV/ClassicClient/Forms/DirectiveFiles/
Filename: data_report_PD_import_script
答案 2 :(得分:3)
您可以使用shell参数扩展。 :
user> p=/EBF/DirectiveFiles/data_report_PD_import_script_ABF1_6
user> echo ${p%/*}
/EBF/DirectiveFiles
user> f=${p##/}
user> echo ${f%_ABF1}
data_report_PD_import_script
[here] [1]是bash
文档的链接。
或者使用read
和GNU sed(不像上面那样可移植):
read dir file < <(sed -r 's:(.*)/(.*)_ABF1.*:"\1" "\2":' <<<"$p")
echo $dir $file
输出:
"/EBF/DirectiveFiles" "data_report_PD_import_script"