ファイル内の行を見つけて読み、コメントアウトされた行を確認してください。

ファイル内の行を見つけて読み、コメントアウトされた行を確認してください。

テキストファイルの処理が詰まったのですが、これが私がやりたいことです。

スクリプトを使用してgitパッチファイルを作成しましたが、パッチファイルが大きく、多くの変更がコメントにのみありました。を使用して大きなパッチファイルを分割し、my/patch/folderThe only one inを使用して各分割パッチを確認しましたsplitdifffindコメントを確認するために別のシェルスクリプトを作成しました。

comments.sh

#!/bin/bash

file=$1

cat $file | grep ^+ | grep -v ^+++ | tr -d " " | tr -d "\t" | cut -c2-3 | while read -r line ; do
    if [ $line != "//" ] ; then
        exit 0
    fi
done

cat $file | grep ^- | grep -v ^--- | tr -d " " | tr -d "\t" | cut -c2-3 | while read -r line ; do
    if [ $line != "//" ] ; then
        exit 0
    fi
done

exit 1

このスクリプトを使用して、変更されたすべての行がこのようであることを確認して、変更がコメントにのみあること+// this is commentを知りたいと思います。

次に、次のスクリプトを実行します。

#!/bin/bash

rm -f small.patch
touch small.patch

find my/patch/folder -type f
-print0 | xargs -0 sh -c '
for i
do
  ./comments.sh "$i"
  [ $? -eq 0 ] && cat "$i" >> small.patch
done
' _

しかし、終了コードは常に./comments.sh "$i"1のようです。理由はわかりませんが、最終的に同じ大きなパッチファイルを生成します。

助けてください、ありがとう!

ベストアンサー1

いくつかの予備的な考え。

while readループの使用はsayを使用するよりも遅いです。grep -qv '//'

cat | grep | grep | TR | cut |grep単に使用するよりも遅くなりますsed

実際のデータがなければ、問題が何であるかを言うのは難しいです。それでは、問題を変更して簡単にテストするための選択肢を見つけましょう。

明らかに私はあなたのデータがないのでこれをテストしませんでした。

それでは、新しいnoncomments.shスクリプトを作成しましょう。コメント以外の行が返されます。これはテストが簡単で、パッチファイルで実行してコメント以外の行が何であるかを確認する必要があります。

#!/bin/sh
# delete the +++ and --- lines from unified diff. remove lines which are not
# added/removed. remove added/removed lines which are comments or blank
# output anything that is left
sed '/^+++/d;/^---/d;/^[+-]/!d;/^.[ \t]*\/\//d;/^.[ \t]*$/d' "$@"

それから一緒に結びます

#!/bin/bash

find my/patch/folder -type f
-print0 | xargs -0 sh -c '
for i
do
  [ -z "$(./noncomments.sh "$i")" ] || cat "$i"
done
' > small.patch

リダイレクトは一度だけ実行されます。

ジョブのバランスを少し変更できます。たとえば、コメントのみが変更された場合にスクリプトが何も出力しないようにしたり、コメントが変更されていない場合にスクリプトにファイル全体を出力させることができます。その後、コマンドは

find my/patch/folder -type f -exec ./noncommentchanges {} \; > small.patch

おすすめ記事