我想将一堆以
#
开头的文件中的评论收集到仅包含评论的文件中。我可以这样做:
find . -type f -exec grep '^#' {} > /path/to/comment/storage/{}
非常简单。然而,这是非常浪费的,因为它为每个文件创建了一个
grep
并创建了很多空文件。 grep -R '^#' .
会好得多,但是我该如何处理它的输出呢?像 export IFS=:;grep -R '^#' .|while read -r file contents; do echo $file-$contents; done
这样的东西是一个有希望的开始,但是当内容本身也包含冒号时,它就会崩溃。它还面临正确创建和附加到每个文件的挑战。
作为额外的限制,这需要使用
busybox
作为 shell / awk / 等运行,GNU utils 不可用。
我不知道 awk 支持在没有 shell 重定向的情况下自行打印到文件,这个 answer 向我展示了并且手册页确认了
print expr-list >file 在文件上打印表达式。 每个表达式由 OFS 的值分隔。 输出记录以 ORS 的值结束。
虽然手册页是 GNU Awk 的,但这似乎也适用于 busybox awk。
其次,我们已经有了关于如何使用 awk 打印除第一个字段之外的所有内容的答案。
所以我们可以做
grep -R '^#' . | \
awk -v FS=: -v OFS=: '{ key = $1; $1 = ""; a[key] = a[key] "\n" substr($0,2) }
END { for (key in a) print substr(a[key], 2) > "/path/to/comments/"key }'`
END
部分需要另一个
substr
,因为
a
数组的每个元素都以空换行符开头。