Вырезание определенной строки из более длинной строки

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

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

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

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

Как я могу это сделать ?

3
задан 25 February 2018 в 18:09

6 ответов

Будет выполняться либо

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
4
ответ дан 22 May 2018 в 12:54

Будет выполняться либо

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
4
ответ дан 17 July 2018 в 20:02

Будет выполняться либо

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
4
ответ дан 23 July 2018 в 20:46

Вы можете использовать команду 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. Таким образом, вся строка ^.*$ будет заменена частью, которая соответствует тому, что находится в скобках.
4
ответ дан 22 May 2018 в 12:54
  • 1
    ЛОЛ. Двое парней, одна мысль. – PerlDuck 25 February 2018 в 18:39
  • 2
    @PerlDuck, я был вдохновлен вашим примером perl и добавил также решение sed. – pa4080 25 February 2018 в 19:09
  • 3
    Ницца. Я также пробовал sed, но поскольку я не знаком с ним, я не работал. Переключатель -r имеет решающее значение, и без него мои попытки все провалились. /// Если бы я был адеком, я бы принял ваш ответ , потому что он также объясняет вещи . Плюс: вы ответили на 17 секунд быстрее. :-) – PerlDuck 25 February 2018 в 19:18
  • 4
    @PerlDuck, мне очень нравятся темы, такие как те, в которых простой вопрос получает большое количество ответов с различными возможными решениями. Вот мой любимый: Как удалить определенные слова из строк текстового файла? – pa4080 25 February 2018 в 19:26

Вы можете использовать команду 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. Таким образом, вся строка ^.*$ будет заменена частью, которая соответствует таковой в скобках.
4
ответ дан 17 July 2018 в 20:02

Вы можете использовать команду 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. Таким образом, вся строка ^.*$ будет заменена частью, которая соответствует таковой в скобках.
4
ответ дан 23 July 2018 в 20:46
  • 1
    ЛОЛ. Двое парней, одна мысль. – PerlDuck 25 February 2018 в 18:39
  • 2
    @PerlDuck, я был вдохновлен вашим примером perl и добавил также решение sed. – pa4080 25 February 2018 в 19:09
  • 3
    Ницца. Я также пробовал sed, но поскольку я не знаком с ним, я не работал. Переключатель -r имеет решающее значение, и без него мои попытки все провалились. /// Если бы я был адеком, я бы принял ваш ответ , потому что он также объясняет вещи . Плюс: вы ответили на 17 секунд быстрее. :-) – PerlDuck 25 February 2018 в 19:18
  • 4
    @PerlDuck, мне очень нравятся темы, такие как те, в которых простой вопрос получает большое количество ответов с различными возможными решениями. Вот мой любимый: Как удалить определенные слова из строк текстового файла? – pa4080 25 February 2018 в 19:26

Другие вопросы по тегам:

Похожие вопросы: