Отрезание определенной нити от более длинной нити

Отрезание определенной нити от более длинной нити

У меня есть строки:

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

Я хочу удалить все, что начинается с Data и заканчивается чем-то похожим на дату:

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

Как мне это сделать?

решение1

Или

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

или

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

подойдет. Они оба печатают минимальную строку, которая начинается Dataи заканчивается чем-то, что выглядит как дата (ГГГГ-ММ-ДД).

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

решение2

Эту команду можно использовать grepследующим образом:

grep -oP 'Data.*[0-9]{4}-[0-9]{2}-[0-9]{2}' input-file > output-file
  • -o, --only-matching- показать только часть строки, соответствующую ШАБЛОНУ.
  • -P, --perl-regexp- ШАБЛОН - это регулярное выражение Perl; или в этом случае можно использовать также опцию -E, --extended-regexp- ШАБЛОН - это расширенное регулярное выражение (ERE).
  • регулярное выражение 'Data.*[0-9]{4}-[0-9]{2}-[0-9]{2}'соответствует вашим требованиям. Оно начинается со строки Data, за которой следует неизвестное количество *любых символов ., и заканчивается форматом даты: 4 digits from 0 to 9тире 2 digits from 0 to 9тире 2 digits from 0 to 9.

Вот еще sedрешение:

sed -r 's/^.*(Data.*[0-9]{4}-[0-9]{2}-[0-9]{2}).*$/\1/' /tmp/input-file 
  • перенаправить вывод в новый файл > output-fileили воспользоваться опцией -i.bakвнесения изменений на свои места и создания резервной копии файла.
  • -r, --regexp-extended- использовать расширенные регулярные выражения в скрипте.
  • команда sозначает замену: /<string-or-regexp>/<replacement>/.
  • ^.*будет соответствовать началу ^строки, за которым следует неизвестное количество любых символов.
  • .*$будет соответствовать концу $строки, перед которой будет стоять неизвестное количество любых символов.
  • внутри , группа захвата (...)будет рассматриваться как переменная \1. Таким образом, вся строка ^.*$будет заменена той частью, которая соответствует тому, что находится в скобках.

Связанный контент