我需要使用sed,gawk或grep从Google驱动器网址中提取我的信息

时间:2019-01-22 06:30:25

标签: awk sed grep

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

所有这些网址我都需要一个正则表达式。
这是我尝试使用的方法,但没有得到预期的结果。

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

预期结果:

0B3X9GlR6EmbnQ0FtZmJJUXEyRTA
1TkLq5C7NzzmbRjd7VGRhauNT9Vaap-Py

4 个答案:

答案 0 :(得分:1)

请您尝试以下。

awk 'match($0,/uc\?id=[^&]*|folders\/[^?]*/){value=substr($0,RSTART,RLENGTH);gsub(/.*=|.*\//,"",value);print value}'  Input_file

答案 1 :(得分:1)

更新您自己的代码:

$ 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

一种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

答案 2 :(得分:1)

尝试一下:

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 

答案 3 :(得分:0)

使用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
$