Cortando determinada string de uma string mais longa

3

Eu tenho strings:

fvvDataFolders/DDB/DDB2018-02-21oM]
fbbDataFolders/DDB/DDB2018-02-22oM]

Eu quero remover tudo o que começa com Data e termina no que parece uma data:

DataFolders/DDB/DDB2018-02-21
DataFolders/DDC/DDB2018-02-22

Como posso fazer isso?

    
por Josef Klimuk 25.02.2018 / 13:33

2 respostas

4

Ou

grep -P -o 'Data.+?\d\d\d\d-\d\d-\d\d'

ou

perl -pe 's/^.+(Data.+?\d\d\d\d-\d\d-\d\d).+$//'

fará. Ambos imprimem a string mínima que começa com Data e termina no que parece uma data (AAAA-MM-DD).

echo "fvvDataFolders/DDB/DDB2018-02-21oM]" > input.txt
echo "fbbDataFolders/DDB/DDB2018-02-22oM]" >> input.txt
grep -P -o 'Data.+?\d\d\d\d-\d\d-\d\d' input.txt

# output:
DataFolders/DDB/DDB2018-02-21
DataFolders/DDB/DDB2018-02-22

perl -pe 's/^.+(Data.+?\d\d\d\d-\d\d-\d\d).+$//' input.txt

# output:
DataFolders/DDB/DDB2018-02-21
DataFolders/DDB/DDB2018-02-22
    
por PerlDuck 25.02.2018 / 15:38
4

Você pode usar o comando grep desta maneira:

grep -oP 'Data.*[0-9]{4}-[0-9]{2}-[0-9]{2}' input-file > output-file
  • -o , --only-matching - mostra apenas a parte de uma linha que corresponde a PATTERN.
  • -P , --perl-regexp - PATTERN é uma expressão regular Perl; ou neste caso pode ser usado também a opção -E , --extended-regexp - PATTERN é uma expressão regular estendida (ERE).
  • o regexp 'Data.*[0-9]{4}-[0-9]{2}-[0-9]{2}' corresponde aos seus requisitos. Começa com a string Data , seguida pelo número desconhecido * de todos os caracteres . e termina com o formato de data: 4 digits from 0 to 9 dash 2 digits from 0 to 9 dash 2 digits from 0 to 9 .

Aqui também está uma solução sed :

sed -r 's/^.*(Data.*[0-9]{4}-[0-9]{2}-[0-9]{2}).*$//' /tmp/input-file 
  • redirecione a saída para um novo arquivo > output-file ou use a opção -i.bak para fazer as alterações em seus locais e criar um arquivo de backup.
  • -r , --regexp-extended - use expressões regulares estendidas no script.
  • o comando s significa substituto: /<string-or-regexp>/<replacement>/ .
  • ^.* corresponderá ao início ^ da linha, seguido pelo número desconhecido de qualquer caractere.
  • .*$ corresponderá ao final $ da linha, precedido por um número desconhecido de qualquer caractere.
  • dentro do, o grupo de captura (...) , será tratado como a variável \ 1. Assim, toda a linha ^.*$ será substituída pela parte que corresponde ao que está entre parênteses.
por pa4080 25.02.2018 / 15:37