正则表达式 [\\\/][^\\\/]*$ 是如何工作的?

正则表达式 [\\\/][^\\\/]*$ 是如何工作的?

我有一些有用的正则表达式的注释,我经常使用的注释如下:

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]匹配abc[\\\/]匹配\/

[^\\\/]有点相似,但^在开头有特殊之处[]:它否定了含义。[^\\\/]匹配任何字符其他\/

[\\\/][^\\\/]*$匹配\/,然后匹配零个或多个其他字符,直到行尾。您的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

相关内容