2

我有一个目录字符串,如:

build_result/09_abc_WQVGA_FullTouch_15M.xyz

我想在最后一个字符之前插入文件的日期.(以 a 为前缀_),所以我使用 sed 如下:

newname=`echo $filename | sed -n 's/\./\_'"$date"'\./p'`

$datesed 命令之前已经计算过了,结果是:

build_result/09_abc_WQVGA_FullTouch_15M_20120420.xyz

但有时会有一些文件名,如:

build_result/09_abc_WQVGA_FullTouch_1.5M.xyz

在最后一个之前有一个额外.的,sed 将$date在第一个之前插入.。如何让它只$date在最后一个之前插入.

4

3 回答 3

3

其他人已经介绍过sed,所以我建议使用您的 shell 的功能来做到这一点。
更少的开销(产生子壳..)!

$ file='build_result/09_abc_WQVGA_FullTouch_15M.xyz'
$ newfile="${file%.*}_$date.${file##*.}"
$ echo "$newfile"
build_result/09_abc_WQVGA_FullTouch_15M_20120420.xyz

使用sed我会这样做:

sed "s/\(.*[^.]\)\./\1_$date./g"
于 2012-04-20T14:11:32.660 回答
2

尝试:

sed -n 's/\(.*\)\./\1_'"$date"'./p'
于 2012-04-20T13:50:46.053 回答
1

例如像这样:

date=2012-04-17
echo "demo.txt.foo" | sed -nr 's/(.*)\.([^.]*)/\1_'$date'.\2/p'
demo.txt_2012-04-17.foo

如果您的日期包含斜杠,您应该为 sed 选择不同的分隔符:

date=2012/04/17
echo "demo.txt.foo" | sed -nr 's|(.*)\.([^.]*)|\1_'$date'.\2|p'
demo.txt_2012/04/17.foo

由于 sed 尝试匹配 greedy,它会在匹配文字点之前尝试捕获尽可能多的字符。随着[^.]*您指定“除了贪婪匹配后面的点之外的所有内容。

sed -r允许您省略遮盖香蕉括号。

于 2012-04-20T13:54:11.853 回答