これは私を戸惑う
次のように常に追加する必要がある変数を持つ大きなCソースファイルがあります。
CycleCounter += SomeValue
一部の値は重要ではありません。
数千行のソースファイルには、このような数百行のコードがあります。すべての割り当てが追加され、予期しない割り当てまたは減算が行われるように努めています。
「+」またはいくつかのスペースと「+」が後に来ないすべてのCycleCounterエントリを探したいです。
私は次のような表現を試してみました。
CycleCounter\s*[^+]
ただし、この場合は「+」が表示される場所も一致します。
これはケース1とも一致しますが、後続の「+」なしでケース2と3のみを一致させたいです。
if (postbyte & 0x80)
{
switch (postbyte & 0x1F)
{
case 0: // Post inc by 1
ea = (*xfreg16[Register]);
(*xfreg16[Register])++;
CycleCounter+=NatEmuCycles21; // good. expression correctly ignored this
break;
case 1: // post in by 2
ea = (*xfreg16[Register]);
(*xfreg16[Register]) += 2;
CycleCounter += NatEmuCycles32; // good. expression incorrectly identified
break;
case 2: // pre dec by 1
(*xfreg16[Register]) -= 1;
ea = (*xfreg16[Register]);
CycleCounter -= NatEmuCycles21; // mistake, subtracted. expression correctly identified
break;
case 3: // pre dec by 2
(*xfreg16[Register]) -= 2;
ea = (*xfreg16[Register]);
CycleCounter = NatEmuCycles32; // mistake, assigned. expression correctly identified
break;
case 4: // no offset
ea = (*xfreg16[Register]);
break;
ベストアンサー1
PCRE(Perl Compatible Regular Expressions)を使用している場合、このアドインは空白のないアイテムを貪欲に一致させ、空白の一致を防ぎます+
。例えば。 PCRE(GNU grepオプション)を使用して行番号を表示するには、withを使用します。\s*
[^+]
grep
-P
-n
grep -Pn 'CycleCounter\s*+[^+]' file
別のPCRE:
grep -Pn 'CycleCounter(?!\s*\+)' file
今回は否定的な予測を使用して指定されますnot followed a '+' or some white space and a '+'
。
sed
以下を使用して、出力から不要な行を削除できます。
sed '/CycleCounter/!d; /CycleCounter[[:space:]]*+/d; =' file
CycleCounterを含まない行を削除し、CycleCounterの後にスペースと「+」を含む行も削除します。=
行番号を印刷します。