你如何在bash中解析文件名?

时间:2008-09-08 10:07:04

标签: bash shell parsing tokenize cut

我的文件名格式如下:

  

system-source-yyyymmdd.dat

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

6 个答案:

答案 0 :(得分:29)

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

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

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

答案 1 :(得分:9)

一个优雅(在我看来:-)只使用内置插件就是把它放到一个数组中

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

然后,你可以找到数组中的部分......

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

警告:如果文件名包含“奇怪”字符,例如空格,或天堂禁止,引号,反引号等,这将不起作用。

答案 2 :(得分:8)

根据您的需要,awk比剪切更灵活。第一个预告片:

# 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称为增强型手机一样; - )

答案 3 :(得分:7)

使用cut命令。

e.g。

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

将提取第一位。

更改-f参数的值以获取相应的部分。

以下是Cut命令的指南。

答案 4 :(得分:1)

另一种方法是使用shell的内部解析工具,这样可以避免创建子进程的成本:

oIFS=$IFS
IFS=-
file="system-source-yyyymmdd.dat"
set $file
IFS=$oIFS
echo "Source is $2"

答案 5 :(得分:0)

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

$ 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

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