sedに正規表現が含まれている場合、ファイルをスキップする方法は?

sedに正規表現が含まれている場合、ファイルをスキップする方法は?

現在、以下を使用しています簡略化されたコマンド到着末尾のスペースを削除そしてファイルの末尾に改行文字を追加する必要な場合:

find . -type f -exec sed -i -e 's/[ \t]\+\(\r\?\)$/\1/;$a\' {} \+

すぐにわかりますが、ここには2つの問題があります。バイナリファイルファイルの末尾に改行文字を追加します。␍␊ 行区切り記号。コミットまたは同様の場合、これらの修正は簡単に元に戻すかスキップされますが、回復量を最小限に抑えたいとgit gui思います。そのために:

スキップする方法はありますか?みんな次の場合はファイルを送信してください。どの行はsed? の正規表現と一致します。

* ␀文字のないバイナリがある可能性があり、意図的に改行や␀文字を混ぜたファイルがある可能性があることを知っています。しかし、私は人の介入を最小限に抑えるソリューションを探しています。私できる作業したいすべてのファイル拡張子を一覧表示することは可能ですが、これは絶えず確認する必要がある非常に長いリストになり、名前の競合によってバイナリがなくなる可能性があります。

複雑解決策:

while IFS= read -r -d '' -u 9
do
    if [[ "$(file -bs --mime-type -- "$REPLY")" = text/* ]]
    then
        sed -i -e 's/[ \t]\+\(\r\?\)$/\1/;$a\' -- "$REPLY"
    else
        echo "Skipping $REPLY" >&2
    fi
done 9< <(find . -type f -print0)

ベストアンサー1

gitバイナリファイルが何であるかについてのアイデアを信じる場合git grept.cppテキストファイルとlsバイナリファイルの両方がチェックインされたとします。

$ ls
t.cpp ls
$ git grep -I --name-only -e ''
t.cpp

この-Iオプションの意味は次のとおりです。

-I
バイナリファイルのパターンと一致しません。

これを式と組み合わせますsed

$ git grep -I --name-only -z -e '' | \
       xargs -0 sed -i.bk -e 's/[ \t]\+\(\r\?\)$/\1/;$a\'

-z/xargs -0奇妙なファイル名を処理するのに役立ちます。)

git grep他の便利なオプションについては、マニュアルページを確認してください。--no-indexあるいは、--cached作業したいファイルセットに応じて役立つことがあります。

おすすめ記事