【问题标题】:Extract Path Contents / File Name Components (BASH)提取路径内容/文件名组件 (BASH)
【发布时间】:2019-03-14 20:36:06
【问题描述】:

我有文件名,我正试图从中提取名称/单词/数字以供以后使用。

例如

/.../Penguins_45_MIA.txt
/.../Sheep_3.5_KIA.txt
/.../Dolphins_19_AWOL.txt

如您所见,文件名中有下划线分隔的组件,这对我很有用。我将它们放入一个数组(“currentpath”)中,然后放入一个循环中,一次处理每个文件(我认为这是一种非常明智的方法?)。我一直在尝试使用以下命令将路径分解为其组成单词和数字:

partialpath=(${currentpath//_/})

然后选择名称的一部分(现在是一个元素),例如使用这样的动物:

${partialpath[-3]}

但这不起作用 - 我一直希望上面的回声会给我一个 DolphinsPenguins 等。当我调查时,echo "${partialpath[@]}" 返回:

/.../Dolphins19AWOL.txt

所以我假设数组只有一个元素?也就是说,整个文件路径都粘在一起,没有任何下划线?还是我选错了元素?

另外,我刚刚注意到最后一个元素仍会使 .txt 文件以最后一个元素结尾,这是次优的。

我希望这很清楚,我知道这是一个简单的问题,但我对编写脚本完全陌生,一整天都在摸不着头脑。

【问题讨论】:

    标签: arrays bash loops path filenames


    【解决方案1】:

    ${currentpath//_/} 只是删除了下划线,它不会破坏字符串。它可以用于数组,但只是对每个元素进行相同的字符串操作。试试这个:

    $: cat x
    /.../Penguins_45_MIA.txt
    /.../Sheep_3.5_KIA.txt
    /.../Dolphins_19_AWOL.txt
    
    while read line
    do tmp="${line##*/}" # remove ALL path stuff from the line 
       tmp="${tmp%.*}"   # remove JUST LAST piece after a dot
       IFS="_" read -a chunk <<< "$tmp"; # split on underscores
       printf "%10s " "${chunk[@]}"; printf "\n"; 
    done < x
      Penguins         45        MIA
         Sheep        3.5        KIA
      Dolphins         19       AWOL
    

    【讨论】:

    • 非常感谢您的简单明了的回答,而且回答的速度也很快。如果医学允许,我会得到你的像素。
    猜你喜欢
    • 2013-09-21
    • 1970-01-01
    • 2010-10-01
    • 2016-06-19
    • 2014-08-04
    • 2011-04-28
    • 2015-09-29
    • 1970-01-01
    相关资源
    最近更新 更多