特定の末尾文字なしで特定の文字列に一致する正規表現

特定の末尾文字なしで特定の文字列に一致する正規表現

これは私を戸惑う

次のように常に追加する必要がある変数を持つ大きな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の後にスペースと「+」を含む行も削除します。=行番号を印刷します。

おすすめ記事