【问题标题】:replace string to asterisk bash将字符串替换为星号 bash
【发布时间】:2013-06-27 23:12:11
【问题描述】:

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

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

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

【问题讨论】:

    标签: regex bash sed rhel


    【解决方案1】:

    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"
    

    【讨论】:

      【解决方案2】:

      改用这个:

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

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

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

      【讨论】:

      • [0-9] 将覆盖所有数字?不知道是1还是13294..谢谢!
      • @user2160077: 试试 !
      【解决方案3】:

      如果您的脚本位于 中(当我看到标签时我会假设,但当我看到它的名称script.sh 时我也怀疑它似乎对 脚本有错误的扩展名),你还不如使用纯 东西:/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
      $ 
      

      完成!

      【讨论】:

        猜你喜欢
        • 2018-09-10
        • 2014-09-07
        • 1970-01-01
        • 2018-12-07
        • 1970-01-01
        • 1970-01-01
        • 2021-03-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多