bash:如何循环遍历dir路径数组并删除它们的某些部分

bash:如何循环遍历dir路径数组并删除它们的某些部分,bash,for-loop,awk,Bash,For Loop,Awk,数组longestPaths包含目录路径。我想通过它们循环并删除它们的前3个目录。例如,给定最长路径中的以下数组项: /foo/bar/dir1/log/2020/02 /foo/bar/dir2/log/2020/01 /foo/bar/dir3/log/2019/12 /log/2020/02 /log/2020/01 /log/2019/12 我希望另一个数组在遍历和修改最长路径中的项后包含以下值: /foo/bar/dir1/log/2020/02 /foo/bar/dir2/log

数组
longestPaths
包含目录路径。我想通过它们循环并删除它们的前3个目录。例如,给定
最长路径中的以下数组项:

/foo/bar/dir1/log/2020/02
/foo/bar/dir2/log/2020/01
/foo/bar/dir3/log/2019/12
/log/2020/02
/log/2020/01
/log/2019/12
我希望另一个数组在遍历和修改
最长路径中的项后包含以下值:

/foo/bar/dir1/log/2020/02
/foo/bar/dir2/log/2020/01
/foo/bar/dir3/log/2019/12
/log/2020/02
/log/2020/01
/log/2019/12
我如何在bash(或awk)中执行此操作? 感谢您

解决方案1和循环: 按照您的要求,精确更改
最长路径
数组的条目:

#/bin/bash
#用样本数据填充最长路径
声明-最长路径=(
“/foo/bar/dir1/log/2020/02”
“/foo/bar/dir2/log/2020/01”
“/foo/bar/dir3/log/2019/12”
)
#循环遍历最长路径数组的索引
对于“${!longestPaths[@]}”中的i;做
#索引处的正则表达式匹配项以提取短路径
[[“${longestPaths[i]}”=~\/log\/[:digit:]{4}\/[:digit:]{2}$]
#将条目替换为正则表达式匹配项的缩短版本
最长路径[i]=“${BASH_重新匹配[0]}”
完成
#调试打印修改后的最长路径数组
字体-p最长路径
输出:

declare-a longestPaths=([0]=”/log/2020/02“[1]=”/log/2020/01“[2]=”/log/2019/12”)
解决方案2使用Bash4(支持
mapfile
这里它不循环,而是使用Gnu
grep
将输入数组项作为空分隔记录进行处理

#/bin/bash
#用样本数据填充最长路径
声明-最长路径=(
“/foo/bar/dir1/log/2020/02”
“/foo/bar/dir2/log/2020/01”
“/foo/bar/dir3/log/2019/12”
)
#声明最短路径的目标数组
声明-最短路径
#将grep的空分隔输出映射到最短路径数组

mapfile-d''最短路径<作为示例,这应该可以工作

#!/usr/bin/env bash

shopt -s extglob

longestpath=(
    /foo/bar/dir1/log/2020/02
    /foo/bar/dir2/log/2020/01
    /foo/bar/dir3/log/2019/12
    /foo/bar/dir51/log/2019/12
    /foo/bar/dir10000/log/2019/12
    /foo/bar/dir99999999999999999999999999999/log/2019/12
)


printf '%s\n' "${longestpath[@]##*dir+([[:digit:]])}"
输出

/log/2020/02
/log/2020/01
/log/2019/12
/log/2019/12
/log/2019/12
/log/2019/12
  • 我在数组元素中添加了一些长的数字字符串,只是为了说明无论在
    dir
    之后有多少位,glob都应该按预期工作
  • 就像我所说的,如果路径名是常量,例如它有
    dir
    后跟数字/数字字符串,那么这应该可以工作

因此,我们鼓励用户添加他们为解决自己的问题所付出的努力,因此请添加他们的努力(而不是降低投票率)。我不知道,抱歉。我认为我们可以问任何与编程相关的问题,而无需付出任何研究努力,例如,这一个-->社区和专家建议在问题中增加努力。如果你看到结束一个问题,在它说的地方有一个选项(请求调试帮助或信息不在那里等等)。因为我们都是来学习的,所以建议增加OP(原创海报)的努力。