【问题标题】:how to get a substring with varied length?如何获得不同长度的子字符串?
【发布时间】:2015-03-12 01:59:44
【问题描述】:

所以我正在编写一个脚本,该脚本从输入中获取子字符串,该输入是文件(/path/to/file.ext) 的路径,如果目录(/path/to) 不存在,它将运行mkdir -p /path/to,然后触摸file.ext

我的问题是,如果/ 的长度可能未知,我如何使用cut 获取/path/to

我的脚本目前看起来像这样

INPUT=$0
SUBSTRING_PATH=`$INPUT | cut -d'/' -f 2`

if [! -d $SUBSTRING_PATH]; then
    mkdir -p $SUBSTRING_PATH
fi

touch $INPUT

【问题讨论】:

  • 旁白:[! -d $SUBSTRING_PATH]not going to work
  • 旁白:想想看,测试路径是否为目录是不必要的,因为mkdir -p 无论如何都不会做任何事情。

标签: bash shell cut substring


【解决方案1】:

使用dirnamebasename 代替cut

input=/path/to/foo
dir=$(dirname "$input")
file=$(basename "$input")

现在$DIR/path/to$FILEfoo

dirname 还会为您提供一个有效目录,用于指向工作目录的相对路径(我的意思是$(dirname file.txt).)。这意味着,例如,您可以编写 "$dir/some/stuff/foo" 而不必担心最终会进入完全不同的目录树(例如 /some/stuff 而不是 ./some/stuff)。

正如@ruakh 在 cmets 中提到的那样,如果您没有目录,而是想要丢弃最后一个令牌的字符串(可能是 csv 文件的一行),那么一种方法是"${input%,*}",其中逗号可以替换为任何分隔符。据我所知,这是一个 bash 扩展。我之所以编辑它,是因为未来的流浪游客可能会比在 cmets 中更幸运地看到它;对于您的特定用例,dirnamebasename 更合适。

【讨论】:

  • + 1;这是实现 OP 目的的最佳方法。请注意,如果这些不是文件名——比如说,如果你有 a:b:c:d:e 并想去掉 :e——你会写 input=a:b:c:d:e ; substring=${input%:*}
  • @ruakh,将"${input%:*}" 与文件名一起使用会有什么问题?
  • @1_CR:这不是问题,只是dirnamebasename 更聪明一点。例如,如果输入是/path/to/foo/,它们将分别返回/path/tofoo,而不是被最后的/ 愚弄。如果输入只是foo,那么dirname 将返回.(意思是“当前工作目录”)。如果您对输入的形状有非常精确的了解,那么您就不需要它们,但如果您只知道它是一个文件路径,那么它们是智能处理它的最佳方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多