Cortar cierta cuerda de una cuerda más larga

Cortar cierta cuerda de una cuerda más larga

tengo cadenas:

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

Quiero eliminar todo lo que comienza con Datos y termina en lo que parece una fecha:

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

¿Cómo puedo hacerlo?

Respuesta1

Cualquiera

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

o

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

servirá. Ambos imprimen la cadena mínima que comienza Datay termina en lo que parece una fecha (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).+$/$1/' input.txt

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

Respuesta2

Puedes usar el comando grepde esta manera:

grep -oP 'Data.*[0-9]{4}-[0-9]{2}-[0-9]{2}' input-file > output-file
  • -o, --only-matching- muestra solo la parte de una línea que coincide con el PATRÓN.
  • -P, --perl-regexp- PATTERN es una expresión regular de Perl; o en este caso podría usarse también la opción -E, --extended-regexp- PATRÓN es una expresión regular extendida (ERE).
  • la expresión regular 'Data.*[0-9]{4}-[0-9]{2}-[0-9]{2}'coincide con sus requisitos. Comienza con la cadena Data, seguida de un número desconocido *de caracteres .y termina con el formato de fecha: guión 4 digits from 0 to 9guión .2 digits from 0 to 92 digits from 0 to 9

Aquí también hay una sedsolución:

sed -r 's/^.*(Data.*[0-9]{4}-[0-9]{2}-[0-9]{2}).*$/\1/' /tmp/input-file 
  • redirija la salida a un nuevo archivo > output-fileo use la opción -i.bakpara realizar los cambios en sus lugares y crear un archivo de respaldo.
  • -r, --regexp-extended- utilice expresiones regulares extendidas en el script.
  • el comando ssignifica sustituir: /<string-or-regexp>/<replacement>/.
  • ^.*coincidirá con el principio ^de la línea, seguido de un número desconocido de caracteres.
  • .*$coincidirá con el final $de la línea, precedido por un número desconocido de caracteres.
  • dentro de, el grupo de captura (...)será tratado como la variable \1. Entonces toda la línea ^.*$será sustituida por la parte que coincida con lo que está entre paréntesis.

información relacionada