如何在 bash 中解析文件名?

How do you parse a filename in bash?

提问人:Nick Pierpoint 提问时间:9/8/2008 最后编辑:dreftymacNick Pierpoint 更新时间:7/7/2018 访问量:42045

问:

我的文件名格式如下:

system-source-yyyymmdd.dat

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

bash shell 解析 tokenize cut

评论


答:

7赞 David 9/8/2008 #1

使用命令。cut

例如

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

将提取第一位。

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

以下是有关“剪切”命令的指南。

32赞 Bobby Jack 9/8/2008 #2

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

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

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

评论

0赞 Jon Ericson 9/10/2008
我很好奇你为什么添加#提示符。通常,该提示指示 root 用户或超级用户。一般来说,我认为像尝试cut命令这样的事情作为普通用户会更好。我会使用 $ 提示符。
0赞 Bobby Jack 9/11/2008
哦,是的 - 好点子。我必须承认,我当时以 root 身份登录,只是去做了——我知道这是一个坏习惯。话虽如此,我认为 echo 和 cut 是两个危害最小的命令:)但是,为了完整起见,我肯定会立即更新示例。干杯。
1赞 EsseTi 10/13/2014
如何将输出分配给变量?如果我这样做不起作用。var = "system-source-yyyymmdd.dat" | cut -d'-' -f2
1赞 Nick Pierpoint 8/17/2016
太棒了 - 3分钟内得到答复 - 这比打电话给朋友还快!- 最初是作为答案添加的,但在我提出问题 6 年后被删除:)
8赞 flight 9/8/2008 #3

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

1赞 Shannon Nelson 9/21/2008 #4

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

oIFS=$IFS
IFS=-
file="system-source-yyyymmdd.dat"
set $file
IFS=$oIFS
echo "Source is $2"
10赞 Colas Nahaboo 1/27/2009 #5

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

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

然后,您可以在阵列中找到零件...

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

注意:如果文件名包含“奇怪”字符,例如空格,或者,上帝禁止,引号,反引号......

0赞 William Pursell 7/6/2018 #6

最简单的(也是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