【问题标题】:Get path to file using bash parameter expansion使用 bash 参数扩展获取文件路径
【发布时间】:2016-10-28 07:50:41
【问题描述】:

给定一个文件的路径,比如说:/home/user1/archive.zip

谁能告诉我如何在不使用外部二进制文件的情况下删除字符串 archive.zip

我知道:

${Path2File##*/}

可以给我文件名,但我需要这个文件夹的路径。

也欢迎提供通配符理解指南或解释。

【问题讨论】:

  • 尝试“目录名路径”
  • 不错的一个!我现在可以管理,直到问题得到回答!谢谢
  • @DarkXDroid :您可以使用参数扩展本身。请参阅我的回答。
  • @nouseforname "没有外部二进制文件",其中包括 dirname
  • @DarkXDroid 有 bash [ builtins ]dirname 不是其中之一。

标签: bash path


【解决方案1】:

"${Path2File%\/*}"

或使用外部二进制文件

dirname "$Path2File" # Not desirable as you've mentioned already

注意事项:

  1. ${parameter%word} 类型的shell 参数扩展中,单词被扩展以产生一个模式,就像在文件名扩展中一样。如果模式匹配参数扩展值的尾随部分,则扩展的结果是删除了最短匹配模式的参数值。
  2. 由于/ 在shell 参数扩展中具有特殊含义,我们只是对其进行了转义,即\/。目的是匹配文件基名,即 /example.zip in /path/to/example.zip 并删除它。

参考:

壳牌[ Parameter Expansion ]

【讨论】:

  • 太棒了!我喜欢第一个解决方案......正是我想要的。非常感谢您的解释
  • 我会的!现在我知道您实际上需要先删除最后一部分才能过滤并获取您需要的数据。现在很清楚了
  • / 仅在与子字符串替换运算符一起使用时具有特殊含义。在%之后,正常处理,不需要转义。
  • @chepner:谢谢。但是在这里这样做有什么害处吗?
  • 不;反斜杠只会稍微混淆字符串。没有特殊含义的转义字符只是扩展为它们自己。
【解决方案2】:

* 通配符表示任何字符都将匹配。 ## 正在从参数中删除最长的匹配模式。例如:

$ a=/path/to/file
$ echo ${a##*t}
o/file

在此示例中,我们说删除直到 t 并包括在内的所有内容。如您所料,它删除了/pat,但当它找到第二个t 时,它继续运行。 (单个# 会停在第一个t)。

一个更有用的示例是删除路径,就像您所做的那样,通过匹配并包括最后一个 /

$ echo ${a##*/}
file

% 匹配字符串的末尾。

$ echo ${a%/*}
/path/to

这意味着从最右边的斜线/和其他所有*中删除。

单个% 寻找最短的匹配。如果我们使用%%,则匹配会一直查找到字符串的开头并匹配第一个字符/ 并吞噬很多内容。

【讨论】:

  • 我喜欢这个解释,并且该命令更便于阅读。我会用你的例子做实验!非常感谢您的时间先生
  • 不客气。我在表达我想说的话时遇到了困难,所以很高兴你从中发现了一些价值。
  • 我知道!正如您所提到的,很难说清楚,但您的解释更好,以便替换“cut”、“grep”、“tr”、“awk”二进制文件以进行简单的字符串操作。据我了解,这更快。再次感谢
猜你喜欢
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多