我有一些有用的正则表达式的注释,我经常使用的注释如下:
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
但是,我还没有从我的示例中弄清楚正则表达式中[\\\/]
和的含义是什么。[^\\\/]
它是如何工作的?
答案1
[\\\/]
包含一个转义字符\
和一个转义字符/
(此处不需要转义该字符)。就像[abc]
匹配a
或b
或c
、[\\\/]
匹配\
或/
。
[^\\\/]
有点相似,但^
在开头有特殊之处[]
:它否定了含义。[^\\\/]
匹配任何字符其他比\
或/
。
[\\\/][^\\\/]*$
匹配\
或/
,然后匹配零个或多个其他字符,直到行尾。您的s
命令将匹配的字符串替换为空。整个 sed 命令删除最后一个\
或最后一个/
(以行中较晚的为准)以及行中后面的所有内容。
笔记:
-E
此特定命令不需要工作。g
不需要(一行中不能找到多个行的末端)。- (已经指出)不需要逃到
/
里面。[]
(一般不需要转义/
到 之外;通常需要它,因为人们特别选择作为 中的分隔符,但它可以是另一个字符,例如。)[]
/
s/…/…/
s|…|…|
- 从某种意义上说,您的命令似乎是“通用的”,它从 Unix 路径名(由 分隔的组件
/
)和 DOS/Windows 路径名(由 分隔的组件\
)中删除最后一个组件。但… \
可能出现在 Unix 路径名中。如果是这样,那么您的 sed 命令可能会给您带来意想不到的结果。还允许使用换行符。/
是一个有效的路径名并且它的父目录是/
。不过,您的 sed 命令会产生一个空字符串。- 如果
dir
是一个目录,则/path/to/dir/
相当于/path/to/dir
,但您的 sed 命令将分别产生/path/to/dir
和/path/to
。