大家好,我正在处理一个网址列表,我只需要 grep 所有以 .asp 或 .aspx 结尾的文件名,并且也不应该有任何重复项,所以我遇到了这个解决方案来删除之前的所有内容最后一个 /
和 .asp
我尝试了这个正则表达式,它删除了最后一个 /
之前的所有内容
([^\/]+$)
例如
abc/abc/abc/xyz.asp
>> xyz.asp
但是,如果 .asp
之后有 /
,它会在 /
abc/abc/abc/xyz.asp?ijk=lmn/opq
>> opq
我不想要
我只想 grep 包含 .asp
和 .aspx
的字符串,并删除最后一个 /
之前及其之后的每个字符。
我简单地说,我只想 grep filename.asp
或 filename.aspx
示例输入
https://www.redacted.com/abc/xyz.aspx?something=something
示例输出:
xyz.aspx
示例输入:
https://www.redacted.com/abc/xyz/file.aspx?z=x&LOC=http%3A%2F%2Fwww.redacted.com%2Fasp%2Fanotherfile-asp%2F_%2FCRID--7% 2Fthirdfile.asp%3Fui%3Dhash
示例输出:
file.aspx, anotherfile-asp, thirdfile.asp
最佳答案
通过显示的示例,在 GNU awk
中,您可以尝试遵循正则表达式,以及与正则表达式一起使用的 match
和 RS
函数。
awk -v RS='[^.]*[-\\.]aspx?' '
RT{
num=split(RT,arr,"[/%2F]")
for(i=1;i<=num;i++){
if(arr[i]~/[-.]asp/){
print arr[i]
}
}
}
' Input_file
如果您的文件包含这两行(如您的问题所示),则示例输出将如下所示:
xyz.aspx
file.aspx
anotherfile-asp
thirdfile.asp
解释:简单的解释是,将RS
(记录分隔符)设置为[^.]*[-\\.]asp
整个输入文件。然后在主程序中使用 /%2F
吐出记录,并检查是否有任何部分包含 -asp 或 .asp,然后打印匹配的部分,如上面的示例输出所示。
关于regex - 使用 [regex] 从 URL 列表中获取带扩展名的 grep 文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70491533/