我得到了一个包含抓地力结果的文件列表。
$ grep -il 'name:red' */*/doc.txt
current_dir/Big_A/Folder1/doc.txt
current_dir/Big_A/Folder2/doc.txt
current_dir/Big_C/Folder5/doc.txt
我现在想要将匹配我的结果的整个文件夹移动到其他地方,并根据其文档文件中的内容重命名。虽然我已经成功地用
替换了我想要的名称$ grep -i 'name:red' */*/doc.txt | cut -f2- -d:
Red Bucket
Red Asparagus
Red Blueberries
我在删除最后一个文件名时画空白,所以我可以移动整个文件夹。
我已经尝试了一些管道与切割,但找不到一个工作方法,让我在正确的位置切割,因为rev不支持在giitbash和cut --output-delimiter=doc
做绝对没有。
编辑:发帖20秒后,我发现sed 's/search/replace'解决了前一半。
这就是我想要的结果。
current_dir/Mars/Red Bucket/doc.txt
current_dir/Mars/Red Asparagus/doc.txt
current_dir/Mars/Red Blueberries/doc.txt
这真的很不清楚。但是像这样的东西呢?
#!/bin/Bash
grep -il 'name:red' */*/doc.txt |
while IFS='' read -r matched; do
folder=${matched%/*}
newdest=$(grep -i -m1 'name:red' "$matched")
echo mv ./"$folder" current_dir/Mars/"$newdest"
done
如果这看起来像你想要的,删除echo
使它实际运行mv
。
cut
不能在字符串上工作的原因是它只允许单个字符分隔符。在这里,我们使用shell内置的参数扩展功能来从文件名中删除后缀。
我们使用grep -m 1
只打印每个文件中的第一个匹配项。如果您知道每个文件中只能有一个匹配项,则可以去掉它。如果您可以指定一个更约束的正则表达式,以确保您只获得一个匹配,也许使用sed
或Awk而不是grep
来从更长的模式匹配中获取有趣的部分。例如,
newdest=$(sed -n 's%.*<tag attrib="name:red">([^<>]*)</tag>.*%1%p' "$matched")
从类xml标记结构中获取感兴趣的字符串。(尽管使用面向行的正则表达式工具处理XML是脆弱和复杂的;如果您的输入确实是XML,则可能需要使用适当的XML解析器。)