У меня есть строки:
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. Таким образом, вся строка^.*$
будет заменена той частью, которая соответствует тому, что находится в скобках.