代码之家  ›  专栏  ›  技术社区  ›  cw84

bash脚本递归遍历文件并使用regex中的匹配项

  •  0
  • cw84  · 技术社区  · 8 年前

    我有一个包含许多子目录的目录。在所有这些子文件夹中,我们都有*.yml文件。

    文件名如下:

    file-name-daily-1.yml
    file-name-daily-2.yml
    file-name-weekly-1.yml
    file-name-weekly-2.yml
    file-name-monthly-1.yml
    

    每个文件中都有一行:

    - name: Some line of text here
    

    我有一个命令,看起来像:

    node index.js --epr --run "[my matched string]" -p $D -p $F -p $T
    

    我需要一个bash脚本,它将递归地搜索目录中包含关键字(daily、weekly、monthly、1、2等)的文件,然后在匹配的文件中获取“:”后面的文本。然后我需要对每一场比赛执行我的命令。

    这个伟大的社区将如何完成这样的任务?

    2 回复  |  直到 8 年前
        1
  •  2
  •   David    8 年前

    无需循环即可完成,如下所示:

    find DIR/ -name *.yml -exec sh -c "grep '\- name\:.*' {} | sed 's/\-name:\(.*\)/\1/'| xargs -I '{}' yourcommand --yourargument {}" \;
    

    在哪里? yourcommand 将替换为要运行的命令,结果为 find .

    先写这个剧本 找到 s通配符表达式匹配的文件。

    然后它执行一个命令,该命令使用 grep 查找文件的相关行,并使用 sed 以获取相关文本。

    最后这些论点被引入 你的命令 用占位符 {} 代替争论。

    您可以使用

    find DIR/ -name *.yml -exec sh -c "grep "^\- name:" {} | sed 's/\-name:\(.*\)/\1/' | xargs -I '{}' echo \"node index.js --epr --run {} -p $F -p $T -p $D1\"" \;
    

    并移除 echo 一旦你对结果满意了。

        2
  •  1
  •   Alex Stiff    8 年前

    可能使用 find 正如潜伏者所说。

    pattern="*-daily*"
    
    for match in $(find . -name $pattern -exec grep '\- name:' {} \; | awk -F ': ' '{print $2}'); do
        node index.js --epr --run "${match}" -p $D -p $F -p $T
    done