複数の空行を持つファイルを見つける方法は?

複数の空行を持つファイルを見つける方法は?

~のため複数の空行を単一の空行に置き換えるまず、大きなリポジトリで適用するファイルを探す必要があります。どうすればいいですか?

答え1

これpcregrepこのユーティリティは複数行パターンのマッチングをサポートしているので簡単です。

まず、私の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

メモ:この$'…'機能にはシェルサポートが必要です(GNU bash、AT&T ksh93、mksh、zsh、およびPOSIX shはすべて将来の標準リリースでサポートされます)。それ以外の場合は、を入力して'Enterを3回押してから'再入力します。

初期リストが十分に明確であれば、結果リストで直接作業できます。

# 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 --

⚠ファイル名に以下が含まれていない限り、「より安全な」バージョンが必要です。どの空白でもない「面白い」文字!最後の例では、「少し安全です」とは、-lpcregrepのオプションが常にLFで出力を終了し、NULで出力を終了するオプションがないため、このソリューションを使用すると、改行を含むファイル名が常に安全ではないという問題ですを表します。

答え2

そしてawkサポートされる実装nextfile:

... -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

関連情報