我有一个目录字符串,如:
build_result/09_abc_WQVGA_FullTouch_15M.xyz
我想在laster .
字符(前缀为_
)之前插入文件的日期,所以我使用sed:
newname=`echo $filename | sed -n 's/\./\_'"$date"'\./p'`
在sed命令之前计算了$date
,结果是:
build_result/09_abc_WQVGA_FullTouch_15M_20120420.xyz
但有时会有一些文件名,如:
build_result/09_abc_WQVGA_FullTouch_1.5M.xyz
在最后一个之前加上.
,而sed会在第一个$date
之前插入.
。如何使其仅在最后$date
之前插入.
?
答案 0 :(得分: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"
答案 1 :(得分:2)
尝试:
sed -n 's/\(.*\)\./\1_'"$date"'./p'
答案 2 :(得分: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尝试匹配贪婪,它会在匹配文字点之前尝试捕获尽可能多的字符。使用[^.]*
,您可以指定除了贪婪匹配背后的点之外的所有内容。
sed -r
允许您省略遮蔽香蕉饼。