我有一个包含许多文件的目录*.org
。我想从所有这些组织文件中选择一段文本。* Learnings
内容中有一个标题。我想从文件* Learnings
头到文件尾进行选择。
我目前的尝试是
find ~/org/journal -name "*.org" -type f | xargs sed -n -e '/\*\ Learnings/,$p'
然而,这仅输出一个串联流。
* Learnings
预期输出将是从查找返回的每个文件的标头之后的内容流
也是解决方案才不是必须使用sed
答案1
通过 GNU 实现sed
,您可以使用-s
aka--separate
选项对每个文件进行单独处理。
find . -name '*.org' -type f -exec sed -s '/\* Learnings/,$!d' {} +
和awk
:
find . -name '*.org' -type f -exec awk '
FNR == 1 {found = 0}; /\* Learnings/ {found = 1}; found' {} +
答案2
在 Perl 中,您可以使用埃夫对于文件的每个结尾都是如此:
find . -type f -name '*.org' -exec perl -ne 'print if /\* Learnings/ .. eof' {} +
使用+
的形式-exec
与 类似xargs
:它通过附加所有找到的文件来构建指定命令的参数。
答案3
除非这是某种家庭作业;-),否则您可以使用与这里使用 GNU 或 *BSD grep:
grep -hrFA 10000 '* Learnings' directory
如果您的文件超过 10000 行,请将 10000 替换为更大的值。
答案4
在 gnu sed 中检查它,
find ~/org/journal -iname "*.org" -type f -exec sed -nE '/\*\sLearnings/,$ p' '{}' +
真正编辑并保存它,源位于扩展名为 .o 的文件中,
find ~/org/journal -iname "*.org" -type f -exec sed -i.o -nE '/\*\sLearnings/,$ p' '{}' +