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+)?"부호 없음"이 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 '='

관련 정보