打印由 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
这会查找以以下内容开头int
或unsigned 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
搜索int
或unsigned int
然后排除找到的任何包含正在=
初始化的指示内容的内容似乎应该可以完成这项工作。
grep -E '^int|^unsigned int' myfile.txt | grep -Ev '='