我有一些有用的正则表达式的注释,我经常使用的注释如下:
echo '/home/user/folder/file.txt' | sed -E 's/[\\\/][^\\\/]*$//g'
我从这个正则表达式得到的结果是父文件夹的路径/home/user/folder
。我了解正则表达式的基础知识:
\s # all white space
\S # no white space
. # all chars
\. # period
+ # sequence of once or more
{5} # sequence of delimited interval
* # sequence of zero or more
? # sequence of once or none
[0-9] # any sequence of number
[a-z] # any sequence of letter
[^x-y] # no sequence of letter
^ # beginning
$ # ending
但是,我还没有设法从我的示例中弄清楚正则表达式的含义[\\\/]
和情况。[^\\\/]
它是如何工作的?
[\\\/]
包含转义\
和转义/
(此处不需要转义此字符)。喜欢[abc]
匹配a
or ,匹配or 。b
_c
[\\\/]
\
/
[^\\\/]
有点相似,但^
在开头很特殊[]
:它否定了含义。[^\\\/]
匹配除or以外的任何字符。\
/
[\\\/][^\\\/]*$
匹配\
or/
,然后匹配零个或多个其他字符,直到行尾。您的s
命令将匹配的字符串替换为空。整个 sed 命令删除最后一个\
或最后一个/
(以该行后面出现的为准)以及该行后面的所有内容。笔记:
-E
不需要此特定命令即可工作。g
不需要(您不能在一行中找到超过一个端点)。/
在里面逃跑。[]
(通常不需要转义/
;[]
通常需要它,因为人们特别选择/
作为分隔符 ins/…/…/
,但它可以是另一个字符,例如s|…|…|
.)/
)和 DOS/Windows 路径名(以 分隔的组件)中删除了最后一个组件\
。但…\
可能出现在 Unix 路径名中。如果是这样,那么您的 sed 命令可能会给您带来意想不到的结果。也允许使用换行符。/
是一个有效的路径名,其父目录是/
. 但是,您的 sed 命令会产生一个空字符串。dir
is a directory then/path/to/dir/
等价于/path/to/dir
,但您的 sed 命令将分别产生/path/to/dir
和/path/to
。