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
答案 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
$