仅使用egrep打印行

仅使用egrep打印行

打印由 int 类型的单个 C 变量的定义组成的行,无需初始化,前面可以选择无符号,后面也可以选择任何单行 // 注释。

我在用

egrep "^int.*[a-zA-Z0-9].*[^=].*;|^ unsigned int.*[a-zA-Z0-9].*[^=].*;" myfile.txt

它打印

int x=9;
int dftr2;

虽然它不打印

int x;

它不应该打印

int x=9;

这是myfile.txt的内容

int x;
int x=9;
int dftr2;
unsigned int dftrxe2;
unsigned int w=1;

必须使用egrep。

答案1

如果我从字面上理解你的问题(并且不要限制自己试图建立在你不完整的答案的基础上),我相信正确的答案是:

egrep '^\s*(unsigned\s+)?int\s+[_A-Za-z][_A-Za-z0-9]*\s*;\s*(//.*)?$' myfile.txt

一步步:

  • ^将搜索锚定到行的开头。
  • \s*允许在行首、声明之前出现任意数量的空白字符(空格或制表符)。
  • (unsigned\s+)?允许“unsigned”出现零次或一次。
    • 如果存在,则后面跟着一个或者更多空格—— \s+.
  • int\s+匹配“int”关键字,后跟一个或多个空格。
  • [_A-Za-z]— C 变量名称的第一个字符必须是字母或下划线 ( _)。
  • [_A-Za-z0-9]*— C 变量名的后续字符可以是字母、下划线、或数字。它们可能有任意数量(包括零,因为我们正在讨论什么如下第一个字符)。
    • (一些 C 编译器可能规定了最大标识符长度。我不记得标准是否这样做,而且我也不会费心去查找它。)
  • \s*允许任意数量的空格...
  • … 之前;
  • \s*允许任意数量的空格分号。
  • (//.*)?— 可选择允许//评论,并且
  • $将搜索锚定到行尾。

如果你愿意,你可以

  • 替换\s[[:space:]] 或, [SpaceTab]
    • 如果您在键盘上输入此内容,则可能需要输入Ctrk+ V,然后Tab 才能在命令行中获取实际的制表符。 (当然,如果您正在编写脚本,这不会成为问题。)
  • 替换[_A-Za-z][_[:alpha:]], 和/或
  • [_A-Za-z0-9]*用。。。来代替[_[:alnum:]]

反例:

egrep '^(unsigned )?int [^=]*;' myfile.txt

另一个答案中显示的命令打印以下行:

int a, b;               // Multiple variables declared.
int c; int d;           // Multiple “int” declarations.
int e; float f;         // Multiple declarations where only the first is an “int”.
int g[9];               // Array.
int *h;                 // Pointer.
int func();             // Function.
int 3D;                 // Illegal variable name.
int 42;                 // Not even an illegal variable name.

(它不应该打印),并跳过以下行:

  int s;                // Space(s) at the beginning of the line.
int     t;              // Tab after “int”.
unsigned  int u;        // Multiple spaces after “unsigned”.
unsigned        int v;  // Tab after “unsigned”.

(它应该打印)。

答案2

这会查找以以下内容开头intunsigned int语句以以下内容结尾;且不包含以下内容的行=

$ egrep '^(unsigned )?int [^=]*;' myfile.txt
int x;
int dftr2;
unsigned int dftrxe2;

请注意,这也适用于注释,并且正确地忽略=注释中的任何内容。考虑这个测试文件:

$ cat myfile2.txt
int y; // y=height
int z=1; // z is depth

这是结果:

$ egrep '^(unsigned )?int [^=]*;' myfile2.txt
int y; // y=height

最后,请注意,它egrep已被弃用。 grep -E是首选:

grep -E '^(unsigned )?int [^=]*;' myfile.txt

答案3

搜索intunsigned int然后排除找到的任何包含正在=初始化的指示内容的内容似乎应该可以完成这项工作。

grep -E '^int|^unsigned int' myfile.txt | grep -Ev '='

相关内容