我试图从用户那里得到一条路径作为输入 用户将输入特定应用程序的特定路径:
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有问题... 也许正则表达式会有帮助吗?
答案 0 :(得分:3)
GNU代码sed:
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)
如果您的脚本位于bash(我在看到标记时会假设,但当我看到它的名称script.sh
似乎有一个{{3的错误扩展名时,我也怀疑它你也可以使用纯bash内容:/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
$
完成!