Bash脚本以递归方式迭代文件并使用来自regex的匹配项

时间:2018-06-12 15:55:15

标签: bash shell

我有一个包含许多子目录的目录。在所有这些子文件夹中,我们有* .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脚本,它会以递归方式在目录中搜索包含关键字(每日,每周,每月,每天等)的文件,然后抓取"之后的文本:"在匹配的文件中。然后我需要针对每场比赛运行我的命令。

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

2 个答案:

答案 0 :(得分:2)

这可以在没有循环的情况下完成,如下所示:

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

其中yourcommand将替换为您要使用find的结果运行的命令。

此脚本首先find通配符表达式匹配的文件。

然后执行一个命令,使用grep查找文件的相关行,并使用sed修改输出以获得相关文本。

最后,参数被传送到yourcommand,占位符{}取代了参数。

您可以使用

测试代码
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

答案 1 :(得分:1)

可能使用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