У меня есть строки:
fvvDataFolders/DDB/DDB2018-02-21oM]
fbbDataFolders/DDB/DDB2018-02-22oM]
Я хочу удалить все, что начинается с Data, и заканчивается тем, что выглядит как дата:
DataFolders/DDB/DDB2018-02-21
DataFolders/DDC/DDB2018-02-22
Как я могу это сделать ?
Будет выполняться либо
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 и заканчивается тем, что выглядит как дата (YYYY-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
Будет выполняться либо
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 и заканчивается тем, что выглядит как дата (YYYY-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
Будет выполняться либо
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 и заканчивается тем, что выглядит как дата (YYYY-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
Вы можете использовать команду grep следующим образом:
grep -oP 'Data.*[0-9]{4}-[0-9]{2}-[0-9]{2}' input-file > output-file
-o, --only-matching - показать только часть строки, соответствующую PATTERN. -P, --perl-regexp - PATTERN - регулярное выражение Perl; или в этом случае можно также использовать опцию -E, --extended-regexp - PATTERN - расширенное регулярное выражение (ERE). regexp '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
-o, --only-matching - отображать только часть строки, соответствующую PATTERN. [!d2 ] -r, --regexp-extended - используйте расширенные регулярные выражения в скрипте. -P, --perl-regexp - PATTERN является регулярным выражением Perl; или в этом случае также можно использовать опцию -E, --extended-regexp - PATTERN - расширенное регулярное выражение (ERE). ^.* будет соответствовать началу ^ строки, за которой следует неизвестное количество символов. regexp '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. часть regexp, заключенный в скобки (...), будет рассматриваться как переменная, а строка <replacement> будет значением этой переменной \1. Таким образом, вся строка ^.*$ будет заменена частью, которая соответствует тому, что находится в скобках. Вы можете использовать команду grep следующим образом:
grep -oP 'Data.*[0-9]{4}-[0-9]{2}-[0-9]{2}' input-file > output-file
-o, --only-matching - показать только часть строки, соответствующую PATTERN. -P, --perl-regexp - PATTERN - регулярное выражение Perl; или в этом случае можно также использовать опцию -E, --extended-regexp - PATTERN - расширенное регулярное выражение (ERE). regexp '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
-o, --only-matching - отображать только часть строки, соответствующую PATTERN. -r, --regexp-extended - используйте расширенные регулярные выражения в скрипте. -P, --perl-regexp - PATTERN является регулярным выражением Perl; или в этом случае также можно использовать опцию -E, --extended-regexp - PATTERN - расширенное регулярное выражение (ERE). ^.* будет соответствовать началу ^ строки, за которой следует неизвестное количество символов. regexp '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. в пределах, группа захвата (...) будет рассматриваться как переменная \ 1. Таким образом, вся строка ^.*$ будет заменена частью, которая соответствует таковой в скобках. Вы можете использовать команду grep следующим образом:
grep -oP 'Data.*[0-9]{4}-[0-9]{2}-[0-9]{2}' input-file > output-file
-o, --only-matching - показать только часть строки, соответствующую PATTERN. -P, --perl-regexp - PATTERN - регулярное выражение Perl; или в этом случае можно также использовать опцию -E, --extended-regexp - PATTERN - расширенное регулярное выражение (ERE). regexp '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
-o, --only-matching - отображать только часть строки, соответствующую PATTERN. -r, --regexp-extended - используйте расширенные регулярные выражения в скрипте. -P, --perl-regexp - PATTERN является регулярным выражением Perl; или в этом случае также можно использовать опцию -E, --extended-regexp - PATTERN - расширенное регулярное выражение (ERE). ^.* будет соответствовать началу ^ строки, за которой следует неизвестное количество символов. regexp '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. в пределах, группа захвата (...) будет рассматриваться как переменная \ 1. Таким образом, вся строка ^.*$ будет заменена частью, которая соответствует таковой в скобках.