为了仅用一个空行替换多个空行我需要首先在一个大存储库中找到哪些文件来应用它。我怎么做?
答案1
这pcregrep
实用程序支持多行模式的匹配,因此这很容易。
首先,您需要一个要在其中搜索的文件列表;在我自己的 git 存储库中git 查找实用程序对此很有用,但常规find(1)
工具和其他工具也可以。
将文件列表传递给pcregrep
,将其输出转储到临时文件中,然后在对其进行操作之前手动检查文件列表(例如,删除第一个列表中存在的二进制文件):
# easy to type version
git find | xargs pcregrep -l -M $'\n\n\n' >/tmp/x
# more secure version
git find -print0 | xargs -0r pcregrep -l -M $'\n\n\n' >/tmp/x
笔记:该$'…'
功能需要 shell 的支持(即将发布的标准版本中的 GNU bash、AT&T ksh93、mksh、zsh 和 POSIX sh 都支持它)。否则,键入'
,按三次回车键,然后'
再次键入。
如果您的初始列表足够清晰,您可以直接对结果列表进行操作:
# easy to type version
$EDITOR $(git find \*.java | xargs pcregrep -l -M $'\n\n\n')
# somewhat more secure version
git find -print0 | xargs -0r pcregrep -l -M $'\n\n\n' | xargs $EDITOR --
⚠ 需要“更安全”的版本,除非您的文件名不包含任何“有趣”的字符,甚至没有空格!最后一个示例中的“稍微更安全”是指 pcregrep 的-l
选项始终以 LF 终止输出并且没有选项以 NUL 终止输出的问题,因此使用此解决方案嵌入换行符的文件名始终不安全。
答案2
... -print0 | xargs -r0 awk '
FNR == 1 {n = 0}
$0 == "" {
if (++n == 2) {
print FILENAME
nextfile
}
next
}
{n = 0}'
更改printf "%s\0", FILENAME
为 NUL 分隔文件名。更改$0 == ""
为!NF
检查空行而不是空行。