题
我有一个文件的格式,如:
system-source-yyyymmdd.dat
我想要能够分析不同的位的文件使用的"-"作为一个界定符。
解决方案
你可以使用 切割的命令 在每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 更灵活的比削减。第一预告:
# 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
参数,获得适当的部分。
这里有一个引导 切 命令。
另一种方法是使用外壳的内部分析工具,它可以避免的成本创造孩子的过程:
oIFS=$IFS IFS=- file="system-source-yyyymmdd.dat" set $file IFS=$oIFS echo "Source is $2"
最简单的(和国际海事组织最好的办法),这样做是简单的使用 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
不隶属于 StackOverflow