【问题标题】:Linux: finding the position of the last '/' in a string onlyLinux:仅在字符串中查找最后一个“/”的位置
【发布时间】:2020-08-26 22:33:31
【问题描述】:

我有这个字符串:

/sandbox/US_MARKETING/COMMON_DATA/BAU/FILES/2020/08/dnb_mi_081420.gz

在不知道其中有多少个“/”的情况下,我希望能够仅将文件读入变量中。

我希望能够从行中的最后一个“/”开始搜索并找到文件名“dnb_mi_081420.gz”。

我想说的是“找到字符串中的最后一个'/',然后将后面的子字符串读取到最后并存储它。

所以我知道它会是这样的:

filename=substr(<position of the last'/'>,<position of first character in last string>)

那么如何找到最后一个'/'的索引位置我猜是我要找的。​​p>

有人知道那是什么吗?

我还尝试使用 basename,但不幸的是,我正在通过“hdfs dfs”来访问 hadoop shell。因此,一些非标准的 Linux 命令(如 basename)不在该词汇表中。我基本上必须将整个字符串存储在一个变量中并对该变量值进行操作。

【问题讨论】:

  • 这是什么外壳?

标签: linux indexof substr


【解决方案1】:

在 bash 中,可以使用parameter expansion

${参数##word}

单词被扩展以产生一个模式并根据下面描述的规则进行匹配(请参阅模式匹配)。如果模式匹配参数扩展值的开头,则扩展结果是具有最短匹配模式('#' 情况)或最长匹配模式('##' 情况)的参数扩展值已删除

例子:

$ s="/sandbox/US_MARKETING/COMMON_DATA/BAU/FILES/2020/08/dnb_mi_081420.gz" && echo ${s##*/}
dnb_mi_081420.gz
$

【讨论】:

  • 感谢您的帮助!我想我可以做到以下几点: FILE_STRING=echo $FILE_NAME_SOURCE| awk '{x=index($1,"dnb_")} {print substr($1,x)}' 但我真的试图绕过硬编码任何东西。您的解决方案很聪明。再次感谢!
【解决方案2】:

您可以使用-state 子命令以指定格式提取有关文件的信息和统计信息。由于您只需要文件名,因此格式只需 "%n"

hdfs dfs -stat "%n" /path/to/file

这可能比基于原始索引的解决方案更昂贵,但不会对性能造成有意义或明显的影响。

【讨论】:

  • 我试过了。不幸的是,我通过“hdfs dfs”来访问 hadoop shell,因此一些非标准的 linux 命令(如 basename)不在该词汇表中。我基本上必须将整个字符串存储在一个变量中并对该变量值进行操作。
  • 啊,我马上更新 eth 答案hdfs dfs -stat "%n" .path to file
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 2023-03-22
  • 2014-09-19
  • 1970-01-01
  • 2013-01-04
  • 2011-10-25
相关资源
最近更新 更多