提问人:Nick Pierpoint 提问时间:9/8/2008 最后编辑:dreftymacNick Pierpoint 更新时间:7/7/2018 访问量:42045
如何在 bash 中解析文件名?
How do you parse a filename in bash?
答:
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
上一个:格式化日志的好方法是什么?
评论