27

我有一个格式如下的文件名:

system-source-yyyymmdd.dat

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

4

6 回答 6

32

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

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

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

于 2008-09-08T10:11:32.130 回答
10

仅使用内置函数的一个漂亮而优雅的(在我看来:-) 是将其放入数组中

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

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

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

警告:如果文件名包含“奇怪”字符(例如空格),或者天堂禁止、引号、反引号...

于 2009-01-27T00:12:46.460 回答
8

根据您的需要,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 称为增强型手机一样 ;-)

于 2008-09-08T11:11:17.667 回答
7

使用cut命令。

例如

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

将提取第一位。

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

这是关于剪切命令的指南。

于 2008-09-08T10:10:18.640 回答
1

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

oIFS=$IFS
IFS=-
文件="系统源-yyyymmdd.dat"
设置$文件
IFS=$oIFS
echo "来源是 $2"
于 2008-09-21T09:32:53.947 回答
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

该主题有许多变体,其中许多是依赖于 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
于 2018-07-06T15:56:27.333 回答