2013-06-30 95 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"