テキストファイルの処理が詰まったのですが、これが私がやりたいことです。
スクリプトを使用して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
答え2
これらのシナリオは、基本的に次のような主張のセットです。子差分データ。そして私たちは主張を聞くたびに次のように連絡します。周りを見てください、例えば、真珠正規表現エンジン。
find my/patch/folder -type f \
-exec perl -lne '
tr/ \t//dr =~
m{(?=^[-+])(?!^([-+])\1{2})(?=^.(?!//))}
and exit 0}{exit 1
' {} \; -exec cat {} + > small.patch
正規表現を学ぶ:
# delete indiscriminately all spaces n TABs
tr/ \t//dr =~
m{ (?# From where I stand...)
(?=^[-+]) (?# I can see the beginning of line to my immediate eight followed by either a plus or minus sign)
### AND ###
(?!([-+])\1{2}) (?# I donot see --- or +++ string at the beginning of line)
###:AND ###
(?=.(?!//)) (# I donot see // as the 2nd and 3rd characters)
}x;
## so when all 3 assertions are met,
can we say that we have seen a
noncomment commit line and so we
promptly exit with a Unixy success (0)
else we wait till the eof to exit with a
Unixy failure (1)