如何在sed中替换字符串中最右边的字符?

时间:2012-04-20 13:46:38

标签: sed

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

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之前插入.

3 个答案:

答案 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允许您省略遮蔽香蕉饼。