Grep - ^ (\ s * $) vs ^ \ s * $

3

Eu quero procurar um campo que tenha apenas espaços. Ao contar, esses dois comandos me deram resultados diferentes:

grep "^\s*$" -E -c
grep "^(\s*$)" -E -c

Outra coisa. Qual é a maneira correta de dizer "espaços apenas ou outra coisa":

grep "^(\s*$|STRING)" -E -c

ou

grep "(^\s*$|^STRING)" -E -c

Ou eles são equivalentes?

    
por user6678 17.04.2011 / 19:42

1 resposta

5

Comum grep não entende \s ou parênteses. (*) Você quer grep -P se disponível ou grep -E / egrep e escreve \s como [ ^I] (onde ^I is Tab ; grep sem -P não entende \t também). Além disso, com aspas duplas, alguns shells processarão o \s e deixarão apenas s ; você deve sempre usar aspas simples com regexes do shell, exceto quando você realmente precisar interpolar uma variável (por exemplo, algo como '^\s*'"$foo"'\s+\(' , alternando entre aspas no parâmetro médio).

As alternativas em seu segundo exemplo (novamente, com -P e cotação única em vez de dupla) fazem a mesma coisa. O primeiro é tecnicamente melhor porque grep não vai recuar tanto, mas praticamente não importa.

(*) pedantismo: os parênteses invertidos irão funcionar, novamente exigindo uma única cotação para que o shell não coma as barras invertidas. egrep geralmente é mais fácil.

    
por 17.04.2011 / 19:55