删除文件名,但保留grep结果中的路径



我得到了一个包含抓地力结果的文件列表。

$ 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解析器。)

最新更新