Мне нужно извлечь из URL-адреса диска Google с помощью sed, gawk или grep - PullRequest
0 голосов
/ 22 января 2019

URL-адрес:

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

Мне нужно одно регулярное выражение для всех этих URL.
Это то, что я пытался использовать, но не получил ожидаемых результатов.

sed -E 's/.*\(folders\)?\(id\)?=?\/?(.*)&?.*/\1/'

Ожидаемые результаты:

0B3X9GlR6EmbnQ0FtZmJJUXEyRTA
1TkLq5C7NzzmbRjd7VGRhauNT9Vaap-Py

Ответы [ 4 ]

0 голосов
/ 22 января 2019

Использование Perl

$ cat rohit.txt
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
$ perl -lne ' s/.*\/.*..\/(.*)$/$1/g; s/(.*id=)//g; /(.+?)(&|\?|$)/ and print $1 ' rohit.txt
0B3X9GlR6EmbnQ0FtZmJJUXEyRTA
1TkLq5C7NzzmbRjd7VGRhauNT9Vaap-Py
1TkLq5C7NzzmbRjd7VGRhauNT9Vaap-Py
$
0 голосов
/ 22 января 2019

С вашим собственным обновленным кодом:

$ 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
0 голосов
/ 22 января 2019

Попробуйте:

sed -E 's/.*(id=|folders\/)([^&?/]*).*/\2/' file

Пояснения:

  • .*(id=|folders\/): после любых символов (.*), за которыми следует id= илиfolders/
  • ([^&?/]*): поиск и захват любых символов, кроме &, ? и /
  • \2: при использовании обратной ссылки совпадающая строка заменяется второйзахваченный текст ([^&?/]*)

Редактировать:

Чтобы удалить дублирующийся URL, просто перенаправьте команду на sort, а затем на uniq (потому что uniq просто удаляет соседние повторяющиеся строки, вы можете захотеть sort список ранее):

sed -E 's/.*(id=|folders\/)([^&?/]*).*/\2/' file | sort | uniq 

Как подсказывает @Tiw при редактировании, вы также можете направить одну команду, используя sort с-u флаг:

sed -E 's/.*(id=|folders\/)([^&?/]*).*/\2/' file | sort -u 
0 голосов
/ 22 января 2019

Не могли бы вы попробовать следующее.

awk 'match($0,/uc\?id=[^&]*|folders\/[^?]*/){value=substr($0,RSTART,RLENGTH);gsub(/.*=|.*\//,"",value);print value}'  Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...