我有一个格式如下的文件名:
system-source-yyyymmdd.dat
我希望能够使用“-”作为分隔符来解析文件名的不同位。
您可以使用cut 命令获取 3 个“字段”中的每一个,例如:
$ echo "system-source-yyyymmdd.dat" | cut -d'-' -f2
source
“-d”指定分隔符,“-f”指定您需要的字段编号
仅使用内置函数的一个漂亮而优雅的(在我看来:-) 是将其放入数组中
var='system-source-yyyymmdd.dat'
parts=(${var//-/ })
然后,您可以在数组中找到零件...
echo ${parts[0]} ==> system
echo ${parts[1]} ==> source
echo ${parts[2]} ==> yyyymmdd.dat
警告:如果文件名包含“奇怪”字符(例如空格),或者天堂禁止、引号、反引号...
根据您的需要,awk比 cut 更灵活。第一个预告片:
# echo "system-source-yyyymmdd.dat" \
|awk -F- '{printf "System: %s\nSource: %s\nYear: %s\nMonth: %s\nDay: %s\n",
$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
命令。
例如
echo "system-source-yyyymmdd.dat" | cut -f1 -d'-'
将提取第一位。
更改-f
参数的值以获得适当的部分。
这是关于剪切命令的指南。
另一种方法是使用shell内部的解析工具,这样可以避免创建子进程的成本:
oIFS=$IFS IFS=- 文件="系统源-yyyymmdd.dat" 设置$文件 IFS=$oIFS echo "来源是 $2"
最简单(也是 IMO 最好的方法)就是使用read
:
$ IFS=-. read system source date ext << EOF
> foo-bar-yyyymmdd.dat
> EOF
$ echo $system
foo
$ echo $source $date $ext
bar yyyymmdd dat
该主题有许多变体,其中许多是依赖于 shell 的:
bash$ IFS=-. read system source date ext <<< foo-bar-yyyymmdd.dat
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