Se eu tirar sua dúvida literalmente (e não se limite a tentar construir sua resposta incompleta) Eu acredito que a resposta correta é:
egrep '^\s*(unsigned\s+)?int\s+[_A-Za-z][_A-Za-z0-9]*\s*;\s*(//.*)?$' myfile.txt
Passo a passo:
-
^
para ancorar a pesquisa ao início da linha. -
\s*
para permitir qualquer número de caracteres em branco (espaço ou tabulação) ocorrer no início da linha, antes da declaração. -
(unsigned\s+)?
para permitir que "unsigned" apareça zero ou uma vez.- Se estiver presente, ele é seguido por um ou mais espaços -
\s+
.
- Se estiver presente, ele é seguido por um ou mais espaços -
-
int\s+
corresponde à palavra-chave "int", seguida também por um ou mais espaços. -
[_A-Za-z]
- o primeiro caractere de um nome de variável C deve ser uma letra ou um sublinhado (_
). -
[_A-Za-z0-9]*
- caracteres subseqüentes de um nome de variável C podem ser letras, sublinhados, ou dígitos . Pode haver qualquer número deles (incluindo zero, já que estamos falando sobre o que segue o primeiro caractere).- (Alguns compiladores C provavelmente impõem um comprimento máximo de identificador. Não me lembro se o Standard faz e eu não vou me incomodar em procurar.
-
\s*
para permitir qualquer número de espaços… - … antes do
;
. -
\s*
para permitir qualquer número de espaços após o ponto e vírgula. -
(//.*)?
- permite opcionalmente um comentário//
e -
$
para ancorar a pesquisa até o final da linha.
Se você quiser, você pode
- substitua
\s
por[[:space:]]
ou[SpaceTab]
,- Se você está digitando isso no teclado, talvez seja necessário digitar Ctrk + V e, em seguida, a aba a fim de obter um caractere de tabulação real na linha de comando. (Claro que isso não será um problema se você estiver escrevendo um script).
- substitua
[_A-Za-z]
por[_[:alpha:]]
e / ou - substitua
[_A-Za-z0-9]*
por[_[:alnum:]]
.
Exemplos de contra-ataque:
O
egrep '^(unsigned )?int [^=]*;' myfile.txt
O comando , mostrado em outra resposta, imprime as seguintes linhas:
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.
(que não deve ser impresso) e pula as seguintes linhas:
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”.
(que deve ser impresso).