如何解析字符串?


1

我是bash的新手,我正在创建一个脚本,该脚本循环遍历目录中的文件,并基于文件名的一部分对文件进行某些处理,到目前为止,我具有以下功能:

#!/bin/bash
DIR="/Users/me/Documents/import/*"
for f in "$DIR"
do
  t=??????
  echo "Loading $f into $t..."
done

因此$f将输出如下内容:/Users/me/Documents/import/time_dim-1272037430173 除此之外,我想t等于time_dim,目录可以是可变长度,并且-1272037430173是固定长度(这是unix时间戳btw)。

最好的方法是什么?

Answers:


4

未经测试:

t=`basename $f | sed -e 's/-[0-9]\+$//'`

它很近,正在返回time_dim-1272037429351
Russ Bradberry

尝试使用上面的编辑版本(+更改为\+符合GNU sed正则表达式文档的内容)
cubeslayer 2010年

1
仍然不起作用,但是我得到了:t=basename $ f | sed's /-[^-] * $ //'``
Russ Bradberry 2010年

我遇到的唯一问题是,t是执行回声之前连接所有的,所以我得到的是这样的:Loading /Users/me/Documents/import/* into date_dim demographic_dim event_log_facts ip_dim location_dim referal_dim time_dim而不是Loading /Users/me/Documents/import/time_dim-1272037430173 into time_dim...等等等等
拉斯Bradberry

1
哦,我认为您实际上并没有遍历文件。尝试删除$ DIR周围的引号:for f in $DIR....就我个人而言,我会说DIR=/Users/me/Documents/import(因此$ DIR只是一个目录,顾名思义),然后for f in $DIR/*这是一个问题。
锥杀手

0

您也可以这样做:

$ t=`basename $f|tr -d '[0-9-]'`
要么

$ t=`basename $f|gawk -F- '{print $1;}'`

编辑:我读错了问题


0
What is the best way to go about this? 

仅使用bash内部构件的“最佳”方法:)

$ s=/Users/me/Documents/import/time_dim-1272037430173
$  echo ${s%-*}
/Users/me/Documents/import/time_dim
$ t=${s%-*}
$ echo ${t##*/}
time_dim
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.