【问题标题】:regex for getting path and filename from string in linux用于从 linux 中的字符串获取路径和文件名的正则表达式
【发布时间】:2012-02-22 09:22:33
【问题描述】:

在 bash 中,我想从命令行字符串中获取文件名。但不是当前的 ($0) 脚本!

我有一个包含参数的脚本文件。我只需要它的脚本!

例如,我有一个字符串,例如: /path/to/file parameter1 -p2

我想得到:/path/to/file(不带参数) 即使在某些情况下:

/an\ example/with.dot.in_it/.hidden_file.sh par\ ameter1 p.dot.2
./script.sh p1 p2
../script.sh p1 p2
/any////relative/../path/./to/script.sh p1 p2

所以在任何有效的 linux 路径和文件名情况下!

是否有用于此目的的正则表达式,或者是否有任何其他方法可以获得此目的?

提前致谢!

【问题讨论】:

  • 您可以使用“cut”命令轻松完成并获取第一个字段,如下所示:echo "$str" |剪切 -d " " -f1
  • 不,如果有空格就不会处理。将使用$cut -d " " -f -2

标签: regex linux path filenames


【解决方案1】:
basename "$string"

或者

${string##*/}

【讨论】:

    【解决方案2】:

    您可以将 perl 的命令行正则表达式功能与 readlink 命令结合使用来始终获取脚本的完整路径。让我们的数据是包含所有命令及其参数的文件名。您可以使用这样的脚本来获取脚本的完整路径:

    while read -r F
    do
        SCRIPT=$(perl -pe 's/^(.*?)(?<!\\) .*$/\1/;s/\\//g' <<< $F)
        readlink -f "$SCRIPT"
    done < data
    

    【讨论】:

    • 谢谢,但我不能在这里使用 $0!并且此计算机上可能不存在该脚本!
    • 这是一个例子。你总是可以做类似echo $(readlink -f ../script.sh)
    • readlink -f "/asd/qwe/../zxc/./script.sh par1 par2" 结果没什么...但它应该返回/asd/qwe/../zxc/./script.sh
    • 您的上述命令应该会出错。请理解 readlink -f 只需要 1 个参数,应该是您的脚本名称或完整路径或相对路径或符号链接等。您的正确命令是:readlink -f "/asd/qwe/../zxc/./script.sh"
    • 好的,但我的问题是从字符串中删除参数,然后检查这是 linux 上下文中的有效路径和文件名!
    【解决方案3】:

    如果您真的想使用正则表达式(上面描述了许多更好的解决方案),那么这可能会对您有所帮助:

    /^(.+[^\\]) /
    

    这匹配直到第一个空格的所有字符,它不跟在 \

    您从捕获的组中获取路径

    【讨论】:

      【解决方案4】:

      您可以使用dirname 命令。

      【讨论】:

      • 这只会打印没有文件名的目录名......但对于路径来说它非常好!
      【解决方案5】:

      要从.hidden_file.sh 中获取shell 或shell 脚本的名称,您可以使用$0

      echo "$0"
      

      【讨论】:

        猜你喜欢
        • 2020-10-23
        • 1970-01-01
        • 2012-03-10
        • 1970-01-01
        • 2021-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多