С вашим собственным обновленным кодом:
$ cat file
1. https://docs.google.com/uc?id=0B3X9GlR6EmbnQ0FtZmJJUXEyRTA&export=download
2. https://drive.google.com/open?id=1TkLq5C7NzzmbRjd7VGRhauNT9Vaap-Py
3. https://drive.google.com/drive/folders/1TkLq5C7NzzmbRjd7VGRhauNT9Vaap-Py?usp=sharing
$ sed -E 's@.*(folders/|id=)([^?&]+).*@\2@' file
0B3X9GlR6EmbnQ0FtZmJJUXEyRTA
1TkLq5C7NzzmbRjd7VGRhauNT9Vaap-Py
1TkLq5C7NzzmbRjd7VGRhauNT9Vaap-Py
$ sed -E 's@.*(folders/|id=)([^?&]+).*@\2@' file | uniq
0B3X9GlR6EmbnQ0FtZmJJUXEyRTA
1TkLq5C7NzzmbRjd7VGRhauNT9Vaap-Py
А ваш обновленный до sed -E 's@.*(folders/|id=)(.*)(\?|&|$).*@\2@'
будет работать на GNU sed.
Вы используете -E
, поэтому нет необходимости экранировать групповые кавычки ()
, а |
означает OR
.
При сопоставлении литерала ?
вам необходимо его экранировать.
И разделитель sed
может измениться на другой символ, который здесь @
.
Примечание uniq
удалит только смежные дубликаты, если дубликаты находятся в разных местах, замените их на sort -u
.
A GNU grep
решение:
$ grep -Poi '(id=|folders/)\K[a-z0-9_-]*' file
0B3X9GlR6EmbnQ0FtZmJJUXEyRTA
1TkLq5C7NzzmbRjd7VGRhauNT9Vaap-Py
1TkLq5C7NzzmbRjd7VGRhauNT9Vaap-Py
Эти два также дают одинаковые результаты, но более точны, чем приведенные выше. sed
один:
sed -E 's@.*(folders/|id=)([A-Za-z0-9_-]*).*@\2@'
sed -E 's@.*(folders/|id=)([[:alnum:]_-]*).*@\2@'
Кстати, +
означает один или несколько вхождений, *
означает ноль или более.
Версия GNU awk
(одновременно удаляет дубликаты):
awk 'match($0,".*(folders/|id=)([A-Za-z0-9_-]+)",m){if(!a[m[2]]++)print m[2]}' file