Primeiro de tudo, você realmente não quer estar fazendo isso. analisar a saída de ls
é muito propenso a erros e há maneiras muito melhores de alcançar o que você deseja ( find
, por exemplo). No entanto, suspeito que seu professor queira que você aprenda expressões regulares e esteja apenas usando isso como um exemplo. Eu certamente espero que sim, de qualquer maneira.
De qualquer forma, isso funcionará na saída que você mostrou em sua pergunta e para esta semana. Ele falhará na próxima semana e falhará se seus nomes de arquivos tiverem espaços ou outra estranheza em seus nomes. Ele falhará em qualquer outra data que não a semana passada especificamente. Dito isso, funciona no seu exemplo:
$ ls -l | sed -En ' s/.*Feb *2[6-8].* (.*)//p; s/.*Mar *[1-4].* (.*)//p; '
4taOS.zip
_cmd.txt
dat1.txt
dat2.txt
dat3.txt
dat4.txt
dat5.txt
dat6.txt
lab1.sh
naredbi.txt
OSPRVKOL2015.plx
perl.plx
vlade.txt
vlez.txt
Estou usando -E
, que ativa expressões regulares estendidas (sem isso, eu precisaria escapar de (
e )
) e -n
, o que significa "não imprima, a menos que eu diga". Em seguida, o operador de substituição deve procurar linhas correspondentes a Feb 2
e qualquer número entre 6 e 8 (últimas semanas em fevereiro) ou Mar
e qualquer número entre 1 e 4 (datas da última semana de março). Se essas linhas corresponderem, substituirá tudo na linha pela última cadeia de caracteres não espaciais. É isso que os parênteses fazem: eles "capturam" um padrão para que ele possa ser usado no lado direito da substituição.