Gostaria de usar um dos três comandos sed (intervalos de números)

0

Existe um arquivo de texto. (test.txt)

1970-01-01
1971-01-01
1972-01-01
1973-01-01
1974-01-01
....
1993-01-01
1994-01-01
1995-01-01
1996-01-01
...
2015-01-01
2016-01-01

Eu gostaria de esclarecer a linha de texto acima em 1995 a partir de 1970.

Abaixo está o comando sed que eu fiz.

sed -i '/197[0-9]/d' test.txt
sed -i '/198[0-9]/d' test.txt
sed -i '/199[0-5]/d' test.txt

Existe uma maneira de usar os três comandos em um comando sed?

    
por DonBit 30.08.2016 / 03:37

3 respostas

8

Como seu arquivo parece estar em ordem de classificação, você pode excluir do início até o final

por exemplo

sed -i '1,/^1995/d' test.txt

Se a data começar antes de 1970,

sed -i '/^1970/,/^1995/d' test.txt

Se o seu arquivo não estiver em ordem, então não há um fácil regex (há um longo e chato) que combine todas as linhas, mas você pode especificar múltiplos

sed -i -e '/^19[78][0-9]/d' -e '/^199[0-5]/d' test.txt
    
por 30.08.2016 / 04:15
3

Quando a aritmética está envolvida, geralmente é mais fácil usar o awk. Por exemplo, para imprimir todas as linhas, exceto aquelas com anos entre 1970 e 1995:

$ awk -F- '$1<1970 || $1 > 1995' test.txt
....
1996-01-01
...
2015-01-01
2016-01-01

Aqui, -F- diz ao awk para usar - como o separador de campo. Isso significa que o primeiro campo, denotado $1 , será o ano.

Ao contrário de sed, awk faz matemática. Assim, $1<1970 é verdadeiro se o ano for menor que 1970. $1 > 1995 é verdadeiro se o ano for maior que 1995. || combina essas duas condições com uma OR lógica. Assim, $1<1970 || $1 > 1995 é verdadeiro para os anos que você deseja manter.

    
por 30.08.2016 / 04:41
-1

Você pode combinar os três em uma única expressão regular.

sed -i '/19[789][0-9]/d' test.txt

O terceiro caractere é verificado para '7', '8' ou '9'.

Você também pode querer adicionar uma âncora para o começo da linha.

sed -i '/^19[789][0-9]/d' test.txt

Isso evita a exclusão de linhas onde "1970" ou "1987" aparecem no meio da linha. Você (geralmente) quer que a expressão regular seja o mais estreita possível, então leva apenas o que você deseja.

    
por 30.08.2016 / 03:42