使用sed从URL中删除最后一个反斜杠之前的内容。

3

我有一个以文件名结尾的URL列表,保存在一个.txt文件中,我需要提取这个文件名。然而,在每个反斜杠之前的字符串和反斜杠数量在不同的URL中有所不同,例如:

https://www.something.com/something/somethingelse/file.zip
https://www.something.com/something/somethingelse/somethingnew/file2.txt

在我的URL中,somethingelsesomethingnew都是常量(由于数据隐私协议不能共享实际的URL),但未来可能会更改。下面的代码适用于第一个URL,但不适用于第二个URL。
sed 's/^.*\/somethingelse\///g' in_file.txt > out_file.txt

我可以使用什么 sed 模式来匹配最后一个反斜杠后的所有内容,而不需要一个字符串常量?


1
反斜杠:\ 斜杠:/ - Cyrus
4个回答

5
你可以在Bash中使用basename命令,例如:
$ basename "https://www.something.com/something/somethingelse/file.zip"
$ file.zip

或者,如果您真的想使用sed:

sed 's#.*/##' in_file.txt > out_file.txt

您可以使用 basenamexargs 处理整个输入文件:<in_file.txt xargs -L 1 basename >out_file.txt - Léa Gris

3
sed 's/^.*[/]//' in_file.txt > out_file.txt

你的正则表达式过于复杂了。回想一下,正则表达式中的.*是根据“贪婪匹配”原则来匹配的,也就是说它会尽可能地向右匹配。因此,无论somethingelse还是somethingnew是否属于匹配部分都没有关系,我们要匹配到该行中最后一个/字符之前的所有字符。
你可以将表达式重写为:
 sed 's/^.*\///' in_file.txt > out_file.txt

请注意,g在您的测试用例中是矛盾的(但不会造成问题)。

太好了 - 谢谢!最近我一直在R中使用非贪婪正则表达式,忘记了bash中的正则表达式是贪婪的。 - Sean Norton
正如你所说,正则表达式是贪婪的,因此甚至可以不使用初始的 ^(尽管有它会更好)。 - Frank N

2
您可以使用不需要任何正则表达式的awk

最初的回答

awk -F/ '{print $NF}' file

file.zip
file2.txt

如果你只想使用sed,那么可以使用以下命令:

最初的回答:

sed 's~.*/~~' file

0

您可以尝试这个方法,仅匹配 / 后面的最后一个内容。

 sed 's:.*\/::' in_file.txt > out_file.txt

in_file.txt 有

https://www.something.com/something/somethingelse/file.zip
https://www.something.com/something/somethingelse/somethingnew/file2.txt
https://www.something.com/something/somethingelse/file1.zip
https://www.something.com/something/somethingelse/somethingnew/file4.txt
https://www.something.com/something/somethingelse/somethingnew/file4/random/hello.txt
justafile.txt

out_file.txt 有

file.zip
file2.txt
file1.zip
file4.txt
hello.txt
justafile.txt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接