2012-04-20 75 views
2

我有這樣一個目錄的字符串:如何替換sed中字符串中最右邊的字符?

build_result/09_abc_WQVGA_FullTouch_15M.xyz 

我想拉斯特.字符(用_前綴)之前插入文件的日期,所以我用了sed,如:

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

$date已sed命令之前被計算出來,其結果是:

build_result/09_abc_WQVGA_FullTouch_15M_20120420.xyz 

但sometim ES會有一些類似的文件名:

build_result/09_abc_WQVGA_FullTouch_1.5M.xyz 

與最後一個前一個額外的.,以及關於sed將第一.之前插入$date。如何在最後的.之前插入$date

回答

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允許您省略遮蓋香蕉麪包。

+0

你說得對。我需要下劃線。 – 2012-04-20 13:59:25

2

嘗試:

sed -n 's/\(.*\)\./\1_'"$date"'./p' 
+0

不需要逃脫點或更換零件下劃線。 – 2012-04-20 14:00:28

+0

非常真實,謝謝! – Chowlett 2012-04-20 14:17:19

3

其他已經涵蓋sed所以我會建議使用你的shell的能力來做到這一點。
更少的開銷(產卵subshel​​l ..)!

$ 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" 
+0

這是另一個正確的答案!但如何製作多個綠色檢查器?哈! – coanor 2012-04-20 14:21:06

+0

我會去殼版。沒有必要回聲,產生一個新的shell,再次加載整個環境,然後加載sed來做一個簡單的替換,當shell本身具有內置功能時。 – c00kiemon5ter 2012-04-20 14:23:45