0

私はパッチファイルからCコメントを取り除こうとしているので、多数の正規表現を調べましたが、パッチから行を削除すると、それらが壊れてしまいます。

regexまたはsedコマンドを記述して、diffパッチファイルでコメントを検索し、コメント行を空白に置き換えます。

これは機能しますsedregexはCファイルで機能しますが、パッチでは別のものが必要です。

sed '/^\/\*/,/\*\//d'

パッチの抜粋の例は次のとおりです。

@@ -382,7 +391,109 @@
        return len;
 }

+/**********************************************************************************
+ * Some patch
+ * Author: Mcdoomington
+ * Do somethimg
+ * 
+ * fix me
+ **********************************************************************************/

誰かアイデアがありますか?

編集:

このフィルターの使用:

sed -e 's,^+ \*.*,+ \/\/Comment removed,' mypatch.patch > output


+/**********************************************************************************
+ //Comment removed
+ //Comment removed
+ //Comment removed

スキップするために\で終わるif行を追加するにはどうすればよいですか?

編集:解決策

最もクリーンな方法ではありませんが、私はsedを陪審員が装備した正規表現で使用しました。

sed -e '/[^\*\/]$/{N;s,^+ \* .*,+ \* Comment removed,;}' patch > output
sed -e '/[^\*\/]$/{N;s,^+\\\* .*,+ \/\* Comment removed,;}' patch > output

2番目のコマンドは少し貪欲すぎる可能性があることに注意してください。ただし、コメントをサニタイズするために、これは機能します。

使い方:

1.)最初のコマンドこれがコメントの終わりであるかどうかを判断するには/ [^ * /]$/それが/then{N; s、^ +\*であるかどうかを判断します。、+ / *コメントが削除されました、;}'は+*(何でも)を見つけて、*コメントが削除されました。

2.)2番目のコマンドこれがコメントの終わりであるかどうかを判断するには、/ [^ * /]$/が/then{N; s、^ +\*であるかどうかを判断します。、+ / *コメントが削除されました、;}'は+*(何でも)を見つけて、*コメントが削除されたものに置き換えます。

4

3 に答える 3

1

正規表現は素晴らしいですが、それほど素晴らしいものではありません。

パッチを作成する前にコメントを削除します。

これができない場合は、パッチを適用します。パッチが適用されたファイルとパッチが適用されていないファイルの両方からコメントを削除してから、パッチを再作成します。

したがって、xhから始めて、x1.hに編集し、パッチを作成します。

diff -u x.h x1.h > patch

次に、xhを持っている人にパッチを公開します

cp x.h xnc.h
sed -e '/^\/\*/,/\*\//d' -i xnc.h
patch x.h patch
cp x.h xnc2.h
sed -e '/^\/\*/,/\*\//d' -i xnc2.h
diff -u xnc.h xnc2.h > patchnc

コメントのないパッチを作成する必要があります。

しかし、パッチを適用したソースツリーとパッチを適用していないソースツリーがある場合は、

find unpatched -exec sed -e ':^/\*:,:\*/:d' -i "{}" \;
find patched -exec sed -e ':^/\*:,:\*/:d' -i "{}" \;
diff -urN unpatched patched > patch
于 2012-05-11T17:18:24.587 に答える
1

私は、コメントのほとんどを使用して缶詰にする迅速で汚いハックジョブを使用しました

sed -e '/[^\*\/]$/{N;s,^+ \* .*,+ \* Comment removed,;}' patch > output
sed -e '/[^\*\/]$/{N;s,^+\\\* .*,+ \/\* Comment removed,;}' patch > output
于 2012-08-10T17:04:52.460 に答える
0

正規表現は使いません。一般的に、それらはライン内で機能します。そして、あなたのファイルは複数行にまたがるコメントを保持します。

単純なパーサーをC/C++またはJavaで記述します。

状態0から開始します。

状態0では、/ *のシーケンスが見つかるまで、文字ごとに読み取り(そして出力)します。

次に、状態1に切り替えます。

状態1では、* /のシーケンスが見つかるまで、文字ごとに読み取ります(出力しないでください)。

于 2012-05-11T17:58:49.467 に答える