2013-06-30 124 views
3

我試圖從用戶獲取路徑作爲輸入。
用戶將進入一個特定路徑的具體應用:將字符串替換爲星號bash

script.sh /var/log/dbhome_1/md5 

我想轉換目錄的數量(在這種情況下 - 1)*(星號)。稍後,腳本將在此路徑上執行一些邏輯。

當我試着輸入sed的,我又立刻陷入與數字 -

echo "/var/log/dbhome_1/md5" | sed "s/dbhome_*/dbhome_\*/g" 

和輸入將是 -

/var/log/dbhome_*1/md5 

我知道,我有一些問題星號通配符和作爲字符... 也許正則表達式將在這裏幫助?

回答

2

用這個代替:

echo "/var/log/dbhome_1/md5" | sed "s/dbhome_[0-9]\+/dbhome_\*/g" 

[0-9]是包含所有數字

字符類因此[0-9]\+匹配一個或多個數字

+0

[0-9]會覆蓋所有數字嗎?我不知道數字是1還是13294 ..謝謝! – Sagi

+0

@ user2160077:嘗試<°))))))>! –

0

如果你的腳本是在(我假設當我看到了標籤,但是當我看到它的名字script.sh似乎對腳本有錯誤的擴展名時,我也懷疑它),那麼您不妨使用純粹的東西:/var/log/dbhome_1/md5則很可能是在位置參數$1,你想要什麼將是實現:

echo "${1//dbhome_+([[:digit:]])/dbhome_*}" 

如果這似乎失敗了,可能是因爲你的extglob外殼可選行爲被關閉。在這種情況下,只需用

shopt -s extglob 

演示開啓:

$ shopt -s extglob 
$ a=/var/log/dbhome_1234567/md5 
$ echo "${a//dbhome_+([[:digit:]])/dbhome_*}" 
/var/log/dbhome_*/md5 
$ 

完成!

3

代碼GNU

sed "s#1/#\*/#" 

$echo "/var/log/dbhome_1/md5" | sed "s#1/#\*/#" 
"/var/log/dbhome_*/md5" 

或者更一般:

sed "s#[0-9]\+/#\*/#" 

$echo "/var/log/dbhome_1234567890/md5" | sed "s#[0-9]\+/#\*/#" 
"/var/log/dbhome_*/md5"