Imprimir linha usando apenas o egrep

0

Imprimir linhas consistindo de uma definição de uma única variável C do tipo int, sem inicialização, opcionalmente precedida por unsigned e, opcionalmente, seguida por qualquer linha única // comment.

Estou usando

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

Imprime

int x=9;
int dftr2;

enquanto não imprimir

int x;

e não deve imprimir

int x=9;

Aqui está o conteúdo do myfile.txt

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

O uso do egrep é obrigatório.

    
por Kaka G Mani 13.09.2016 / 01:01

3 respostas

3

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+ .
  • 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).

    
por 13.09.2016 / 08:30
1

Isso procura as linhas que começam com int ou unsigned int para as quais a instrução termina com ; e não contém = :

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

Observe que isso também funciona com os comentários e ignora corretamente qualquer = no comentário. Considere este arquivo de teste:

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

Este é o resultado:

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

Por fim, observe que egrep está obsoleto. grep -E é o preferido:

grep -E '^(unsigned )?int [^=]*;' myfile.txt
    
por 13.09.2016 / 01:25
0

A pesquisa por int ou unsigned int e a exclusão de qualquer coisa encontrada que inclua = indicando algo que está sendo inicializado parece que deve fazer o trabalho.

grep -E '^int|^unsigned int' myfile.txt | grep -Ev '='
    
por 13.09.2016 / 01:12