Regular-Expression

正則表達式匹配沒有特定尾隨字元的特定字元串

  • October 7, 2020

這讓我難過

我有一個大型 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;

如果使用 Perl 兼容正則表達式 (PCRE),添加+after\s*將貪婪地匹配零個以上[^+]的空格,從而阻止匹配空格。例如。使用grepwith-P來使用 PCRE(一個 GNU grep 選項)並-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 後跟任何空格和“+”的行。=列印行號。

引用自:https://unix.stackexchange.com/questions/613259