【问题标题】:Shell Script extracting particular path from given pathShell脚本从给定路径中提取特定路径
【发布时间】:2017-02-25 12:29:17
【问题描述】:

我的完整路径是/data7/stmt_data16/pdf/RL/20170202/INLAND/641/K_EDGE1_641 我想只提取和打印从pdf 目录开始的路径, 即/pdf/RL/20170202/INLAND/641/K_EDGE1_641。

那么如何在 shell 脚本中使用 sed 或 awk 命令来实现呢?

【问题讨论】:

  • 你的尝试在哪里?
  • 这里还有一个问题我想从给定路径 /data7/stmt_data16/pdf/RL/20170202/INLAND/641/K_EDGE1_641 中提取最后一个文件路径,即“K_EDGE1_641”,我想从中提取给定路径以将其用作文件名,那么如何实现呢?

标签: shell awk sed


【解决方案1】:

如果你的 shell 是 bash,你既不需要 sed 也不需要 awk:

path='/data7/stmt_data16/pdf/RL/20170202/INLAND/641/K_EDGE1_641'
echo "${path#*/pdf/}"
RL/20170202/INLAND/641/K_EDGE1_641

这也切断了/pdf/,但可以手动重新添加:

echo "/pdf/${path#*/pdf/}"

【讨论】:

    【解决方案2】:

    grep

    $ path='/data7/stmt_data16/pdf/RL/20170202/INLAND/641/K_EDGE1_641'
    $ echo $path | grep -o '/pdf.*'
    $ /pdf/RL/20170202/INLAND/641/K_EDGE1_641
    

    -o - 仅打印匹配

    【讨论】:

      【解决方案3】:

      AWK 使用字符串 match 和 substr 函数的方法:

      path='/data7/stmt_data16/pdf/RL/20170202/INLAND/641/K_EDGE1_641'
      echo "$path" | awk 'match($0, /\/pdf.*/) {print substr($0, RSTART, RLENGTH) }'
      

      输出:

      /pdf/RL/20170202/INLAND/641/K_EDGE1_641
      

      SED 方法:

      path='/data7/stmt_data16/pdf/RL/20170202/INLAND/641/K_EDGE1_641'
      echo "$path" | sed -n 's/.*\(\/pdf.*\)/\1/p'
      

      【讨论】:

        【解决方案4】:

        这里有这么多的解决方案...用纯 bash 再抓一个:

        echo "${mypath/*pdf//pdf}"
        

        【讨论】:

        • 谢谢,这里还有一个问题,我想从给定路径 /data7/stmt_data16/pdf/RL/20170202/INLAND/641/K_EDGE1_641 即“K_EDGE1_641”中提取最后一个文件路径,我想从给定路径中提取以将其用作文件名,那么如何实现呢?
        • @user1863300 和 basename $var
        【解决方案5】:
        path='/data7/stmt_data16/pdf/RL/20170202/INLAND/641/K_EDGE1_641'
        
        echo "$path" |awk -F '_data16' '{print $2}'
        /pdf/RL/20170202/INLAND/641/K_EDGE1_641
        

        【讨论】:

        • 只有当您知道 data16 将永远存在时,这才有效。如果路径包含 data17 而不是,将不起作用。
        • 请提供一些解释。仅代码的答案通常不受欢迎。
        【解决方案6】:

        也可以这样做:

        sed -r 's#(.*)(/pdf/.*)#\2#' <<<"$yourpathvvar"
        

        测试:

        mypath="/data7/stmt_data16/pdf/RL/20170202/INLAND/641/K_EDGE1_641"
        sed -r 's#(.*)(/pdf/.*)#\2#' <<<"$mypath"
        /pdf/RL/20170202/INLAND/641/K_EDGE1_641
        

        【讨论】:

        • @user1863300 当然它可以工作 - 查看测试并自己尝试。也许您的系统中的 sed 版本不同?
        猜你喜欢
        • 2011-07-15
        • 2021-08-15
        • 2012-02-15
        • 1970-01-01
        • 1970-01-01
        • 2015-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多