テキストファイルの処理が詰まったのですが、これが私がやりたいことです。
スクリプトを使用してgitパッチファイルを作成しましたが、パッチファイルが大きく、多くの変更がコメントにのみありました。を使用して大きなパッチファイルを分割し、my/patch/folder
The only one inを使用して各分割パッチを確認しましたsplitdiff
。find
コメントを確認するために別のシェルスクリプトを作成しました。
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