Regex 正则表达式帮助-什么';怎么了?

Regex 正则表达式帮助-什么';怎么了?,regex,sed,Regex,Sed,我想在我的正则表达式方面寻求帮助。我需要从每个URL中提取最后一部分。在下面的示例中,我将其标记为“to_extract” 我想知道以下正则表达式在与sed一起使用时有什么问题: sed 's/^[ht|f]tp.*\///' file.txt file.txt的示例内容: http://a/b/c/to_extract ftp://a/b/c/to_extract ... 我只得到ftp链接的正确结果,而不是http。 提前感谢您对此的解释。 i、 将[ht | f]更改为(ht | f)

我想在我的正则表达式方面寻求帮助。我需要从每个URL中提取最后一部分。在下面的示例中,我将其标记为“to_extract”

我想知道以下正则表达式在与sed一起使用时有什么问题:

sed 's/^[ht|f]tp.*\///' file.txt
file.txt的示例内容:

http://a/b/c/to_extract
ftp://a/b/c/to_extract
...
我只得到ftp链接的正确结果,而不是http。 提前感谢您对此的解释。
i、

[ht | f]
更改为
(ht | f)
,这样会得到更好的结果

[abc]
表示“一个字符是
a
b
c

[ht | f]
表示“一个字符是
h
t
f
”,完全不是你想要的

在某些版本的sed上,您必须使用
-r
选项调用它,以便可以使用扩展正则表达式:

sed -r 's/^(ht|f)tp.*\///' file.txt
如果您只想提取url的最后一部分,而不需要任何其他内容,那么您可能需要

sed -rn 's/^(ht|f)tp.*\///p' file.txt

[ht | f]
更改为
(ht | f)
,这样会得到更好的结果

[abc]
表示“一个字符是
a
b
c

[ht | f]
表示“一个字符是
h
t
f
”,完全不是你想要的

在某些版本的sed上,您必须使用
-r
选项调用它,以便可以使用扩展正则表达式:

sed -r 's/^(ht|f)tp.*\///' file.txt
如果您只想提取url的最后一部分,而不需要任何其他内容,那么您可能需要

sed -rn 's/^(ht|f)tp.*\///p' file.txt
使用“basename”如何:

您可以通过for循环简单地实现您想要的

#!/bin/bash

myarr=( $(cat ooo) )

for i in ${myarr[@]}; do

basename $i

done
使用“basename”如何:

您可以通过for循环简单地实现您想要的

#!/bin/bash

myarr=( $(cat ooo) )

for i in ${myarr[@]}; do

basename $i

done

+1仅供参考,适用于GNU sed,而非posix版本。taht不允许在没有
-r
的情况下使用
,您需要在许多
sed
方言中反斜杠括号和管道字符。您应该会发现
sed'/\(ht\\\f\)tp/'
也适用于GNU
sed
。@tripleee感谢您提供的信息(我仍然保留我的答案,因为我认为使用r参数更具可读性和方便性)。请注意-r参数仅由GNU sed支持。更方便和可移植的方法是对括号进行转义。+1仅用于提供信息,在GNU sed上工作,而不是posix版本。taht不允许使用
而不使用
-r
您需要在许多
sed
方言中对括号和管道字符进行反斜杠。您应该会发现
sed'/\(ht\\\f\)tp/'
也适用于GNU
sed
。@tripleee感谢您提供的信息(我仍然保留我的答案,因为我认为使用r参数更具可读性和方便性)。请注意-r参数仅由GNU sed支持。更方便和可移植的方法是转义括号。既然可以使用sed,为什么还要编写循环呢?当然,我认为sed是每个人都想使用的第一优先事项,我只想说,有另一种方法可以处理没有regex的一般情况,但无论如何,你是对的,为什么要在可以使用sed的情况下编写循环呢?当然,我认为sed是每个人都想使用的首要任务,我只想说,有另一种方法可以处理没有regex的一般情况,但无论如何,你是对的