Eu tenho um arquivo cujo conteúdo é semelhante ao seguinte.
0
0
0.2
0
0
0
0
Eu preciso remover todas as linhas com um único zero.
Eu estava pensando em usar grep -v "0"
, mas isso remove também a linha contendo 0.2. Eu vi que poderia usar a -w
opção, mas isso também não parece funcionar.
Como posso remover todas as linhas contendo apenas um único 0 e manter todas essas linhas começando com 0?
De
man grep
:-w
falha porque o primeiro0
em0.02
é considerado uma "palavra" e, portanto, essa linha é correspondida. Isso ocorre porque é seguido por um caractere "não-palavra". Você pode ver isso se executar o comando original sem-v
, ou seja,grep -w "0"
.Com grep:
^
significa início da linha,$
significa fim da linha.Embora
grep
possa ser usado para isso (como outras respostas mostram claramente), vamos dar um passo para trás e pensar no que você realmente deseja:Regex interpreta dados de sequência de caracteres. Eles não sabem sobre números, apenas sobre dígitos individuais (e combinações regulares deles). Embora no seu caso específico haja um truque simples em torno dessa limitação, em última análise, é uma incompatibilidade de requisitos.
A menos que haja uma boa razão para usar
grep
aqui (por exemplo, porque você o mediu e é muito mais eficiente, e a eficiência é crucial no seu caso), recomendo usar uma ferramenta diferente.awk
, por exemplo, pode filtrar com base em comparações numéricas, por exemplo:Mas também, para obter todas as linhas contendo números maiores que zero:
Eu amo regex, é uma ótima ferramenta. Mas não é a única ferramenta. Como diz o ditado, se tudo o que você tem é
grep
, tudo parece uma linguagem regular.grep
's-w
é um pouco complicado de uma maneira que divide a string original em constituintes de palavras e não palavras (qualquer coisa, exceto letras, dígitos ou sublinhado) .0
Uma vez que já encontrou um constituinte de palavra válido,0.02
ele afirmou a lógica de negação para remover a linha.Usar
sed
é um pouco fácil neste contexto apenas remover as palavras inteiras que correspondemQuando as linhas que você deseja excluir contêm apenas um
0
seguido pela próxima linha, você pode selecionar essas linhas emitindo o seguinte comando:Isso imprimirá apenas as ocorrências
0
que estão no final de uma linha e no início de uma linha ao mesmo tempo. A-v
opção então inverte nossa seleção.\b
- borda da palavracombine o início da linha, seu padrão e o fim da linha
ou como @Sparhawk sugeriu
-vx
lineregexpObserve que
-w
funciona, mas no seu caso0.2
são duas palavras porque o caractere ponto é um separador de palavras.Outra resposta por uma questão de variedade, supondo que você tenha um computador habilitado para PCRE
grep
isso executa uma antecipação negativa para corresponder às linhas que começam
0
e não são seguidas por um ponto. Em seguida,-v
descarta as linhas não correspondentes. Você pode ver em ação aquiSupondo que qualquer linha que não seja apenas um único 0 tenha um período
grep '\.' file