5

我正在尝试从用户那里获取路径作为输入。
用户将为特定应用程序输入特定路径:

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

我知道我对星号通配符和字符有一些问题......也许正则表达式在这里会有所帮助?

4

3 回答 3

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"
于 2013-06-30T22:37:33.260 回答
2

改用这个:

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

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

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

于 2013-06-30T19:45:35.550 回答
0

如果您的脚本在中(当我看到标签时我假设,但当我看到它的名称script.sh似乎对脚本有错误的扩展名时我也怀疑它),您不妨使用纯的东西:/var/log/dbhome_1/md5将非常可能在 positional parameter$1中,您想要的将通过以下方式实现:

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

如果这似乎失败了,可能是因为您的extglobshell 可选行为已关闭。在这种情况下,只需打开它

shopt -s extglob

演示:

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

完毕!

于 2013-06-30T21:52:26.733 回答