초기화 없이 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+)?
"부호 없음"이 0개 또는 1개 발생하도록 허용합니다.- 존재하는 경우, 그 뒤에는이상공간 -
\s+
.
- 존재하는 경우, 그 뒤에는이상공간 -
int\s+
하나 이상의 공백이 뒤에 오는 "int" 키워드와 일치합니다.[_A-Za-z]
— C 변수 이름의 첫 번째 문자는 문자 또는 밑줄(_
)이어야 합니다.[_A-Za-z0-9]*
—C 변수 이름의 다음 문자는 문자, 밑줄,또는 숫자. 여기에는 어떤 숫자든 있을 수 있습니다(0을 포함하여 우리는 무엇을 논의하고 있으므로다음과 같이첫 번째 문자).- (일부 C 컴파일러는 최대 식별자 길이를 지정할 수 있습니다. 표준에서 이를 수행하는지 기억이 나지 않으며 굳이 찾아보지도 않겠습니다.)
\s*
공백은 얼마든지 허용하세요...- … 전에
;
. \s*
원하는 만큼의 공백을 허용하세요.뒤쪽에세미콜론.(//.*)?
— 선택적으로//
댓글을 허용합니다.$
줄 끝까지 앵커 검색을 수행합니다.
원한다면 할수있어
\s
또는 로 바꾸십시오[[:space:]]
.[SpaceTab]
- 키보드에서 이것을 입력하는 경우 명령줄에 실제 탭 문자를 가져오기 전에 Ctrk+를 입력해야 할 수도 있습니다 . (물론 스크립트를 작성하는 경우에는 문제가 되지 않습니다.)VTab
- , 및/또는
[_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 '='