关于shell:如何解析bash中的文件名?

关于shell:如何解析bash中的文件名?

How do you parse a filename in bash?

我的文件名格式如下:

system-source-yyyymmdd.dat

我希望能够使用"-"作为分隔符来解析文件名的不同位。


您可以使用cut命令获取3个``字段''中的每个字段,例如:

1
2
$ echo"system-source-yyyymmdd.dat" | cut -d'-' -f2
source

" -d"指定分隔符,"-f"指定所需字段的编号


仅内置的一种不错且优雅的方法(在我看来:-)是将其放入数组中

1
2
var='system-source-yyyymmdd.dat'
parts=(${var//-/ })

然后,您可以在数组中找到零件。

1
2
3
echo ${parts[0]}  ==> system
echo ${parts[1]}  ==> source
echo ${parts[2]}  ==> yyyymmdd.dat

警告:如果文件名包含空格等"奇怪"字符,或者天堂禁止使用引号,反引号,则此操作将无效。


根据您的需求,awk比cut更灵活。第一个预告片:

1
2
3
4
5
6
7
8
9
10
11
12
13
# echo"system-source-yyyymmdd.dat" \
    |awk -F- '{printf"System: %s
Source: %s
Year: %s
Month: %s
Day: %s
",
              $1,$2,substr($3,1,4),substr($3,5,2),substr($3,7,2)}'

System: system
Source: source
Year: yyyy
Month: mm
Day: dd

问题在于,将awk描述为"更灵活"肯定像是将iPhone称为增强型手机;-)


使用cut命令。

例如

1
echo"system-source-yyyymmdd.dat" | cut -f1 -d'-'

将提取第一位。

更改-f参数的值以获取适当的部分。

这是有关Cut命令的指南。


另一种方法是使用外壳程序的内部解析工具,这避免了创建子进程的开销:

1
2
3
4
5
6
oIFS=$IFS
IFS=-
file="system-source-yyyymmdd.dat"
set $file
IFS=$oIFS
echo"Source is $2"

最简单(也是IMO最佳方法)的方法是使用read

1
2
3
4
5
6
7
$ IFS=-. read system source date ext << EOF
> foo-bar-yyyymmdd.dat
> EOF
$ echo $system
foo
$ echo $source $date $ext
bar yyyymmdd dat

该主题有多种变体,其中许多取决于外壳:

bash$ IFS=-. read system source date ext <<< foo-bar-yyyymmdd.dat

1
2
3
echo"$name" | { IFS=-. read system source date ext
   echo In all shells, the variables are set here...; }
echo but only in some shells do they retain their value here


推荐阅读

    linuxln命令实例?

    linuxln命令实例?,位置,数据,链接,地方,信息,文件,系统,概念,名字,盘中,ln命

    了解linux下常用命令?

    了解linux下常用命令?,工作,地址,系统,信息,命令,标准,目录,常用命令,操作,

    linux获取地址命令?

    linux获取地址命令?,地址,网络,信息,系统,设备,终端,命令,中心,管理,数字,lin

    linux的u盘启动命令?

    linux的u盘启动命令?,系统,电脑,工具,信息,软件,网上,名称,工作,设备,通用,从

    linux设置路由器命令?

    linux设置路由器命令?,网络,信息,代码,地址,电脑,工作,环境,系统,密码,路由,l

    基本linux命令面试题?

    基本linux命令面试题?,系统,情况,设备,实时,工具,分析,证书,时间,教育,认证,

    linux命令连接光驱?

    linux命令连接光驱?,系统,位置,设备,数据,电脑,服务,资料,盘中,智能,管理,Lin

    linuxlspv命令?

    linuxlspv命令?,系统,管理,软件,产品,统一,发行,技术,情况,环境,实时,aix查看

    linux下分区命令行?

    linux下分区命令行?,系统,工具,设备,信息,分区,情况,首次,名称,网络,命令,lin

    u进入linux命令行?

    u进入linux命令行?,系统,地址,服务,电脑,命令,管理,工作,首页,终端,目录,linu

    更改时间linux命令?

    更改时间linux命令?,时间,系统,命令,环境,网上,信息,资料,概念,位置,终端,lin

    linux命令行更改中文?

    linux命令行更改中文?,系统,环境,管理,国家,信息,软件,文化,设备,中文,命令,l

    linux查u盘系统命令?

    linux查u盘系统命令?,系统,设备,电脑,信息,管理,定期,软件,密码,生产,百分比

    linux查管道行的命令?

    linux查管道行的命令?,工作,系统,命令,地址,标准,目录,信息,管理,管道,文件,L

    linux系统关键命令?

    linux系统关键命令?,地址,工作,系统,信息,命令,目录,检测,环境,工具,设备,Lin

    linux中如何结束命令?

    linux中如何结束命令?,系统,状态,管理,暂停,软件,进程,命令,传播,信息,代码,l

    linux中的下载命令行?

    linux中的下载命令行?,软件,系统,网络,电脑,名称,密码,官网,位置,服务,代理,l

    linux取消上一个命令?

    linux取消上一个命令?,系统,状态,信息,命令,网站,网上,目录,程序,快捷键,目

    linux命令菜鸟cal?

    linux命令菜鸟cal?,系统,工作,地址,信息,基础,工具,命令,目录,环境,标准,linu

    linux防火墙命令启动?

    linux防火墙命令启动?,系统,状态,管理,密码,服务,工具,防火墙,网络,信息,软