我有一个文件的格式,如:

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top