如何从 find 的文件流中使用 sed 块文本

如何从 find 的文件流中使用 sed 块文本

我有一个包含许多文件的目录*.org。我想从所有这些组织文件中选择一段文本。* Learnings内容中有一个标题。我想从文件* Learnings头到文件尾进行选择。

我目前的尝试是

find ~/org/journal -name "*.org" -type f | xargs sed -n -e '/\*\ Learnings/,$p'

然而,这仅输出一个串联流。

* Learnings预期输出将是从查找返回的每个文件的标头之后的内容流

也是解决方案才不是必须使用sed

答案1

通过 GNU 实现sed,您可以使用-saka--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' '{}' +

相关内容