将字符串替换为星号bash

时间:2013-06-30 19:42:27

标签: regex bash sed rhel

我试图从用户那里得到一条路径作为输入 用户将输入特定应用程序的特定路径:

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

我知道我的星号通配符和char有问题... 也许正则表达式会有帮助吗?

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分:2)

改为使用:

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

[0-9]是一个包含所有数字的字符类

因此[0-9]\+匹配一个或多个数字

答案 2 :(得分:0)

如果您的脚本位于(我在看到标记时会假设,但当我看到它的名称script.sh似乎有一个{{3的错误扩展名时,我也怀疑它你也可以使用纯内容:/var/log/dbhome_1/md5很可能位于位置参数$1中,你想要的是:

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

如果这似乎失败了,可能是因为您的extglob shell可选行为已关闭。在这种情况下,只需使用

打开它
shopt -s extglob

演示:

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

完成!