Regular-Expression

正則表達式如何///^/^/^/*$ 工作?

  • April 15, 2022

我有一些有用的正則表達式的註釋,我經常使用的註釋如下:

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]匹配aor ,匹配or 。b_c``[\\\/]``\``/

[^\\\/]有點相似,但^在開頭很特殊[]:它否定了含義。[^\\\/]匹配除or以外的任何字元。\``/

[\\\/][^\\\/]*$匹配\or /,然後匹配零個或多個其他字元,直到行尾。您的s命令將匹配的字元串替換為空。整個 sed 命令刪除最後一個\或最後一個/(以該行後面出現的為準)以及該行後面的所有內容。

筆記:

  • -E不需要此特定命令即可工作。
  • g不需要(您不能在一行中找到超過一個端點)。
  • (已經註意到)不需要/在裡面逃跑。[](通常不需要轉義/[]通常需要它,因為人們特別選擇/作為分隔符 in s/…/…/,但它可以是另一個字元,例如s|…|…|.)
  • 從某種意義上說,您的命令似乎是“通用的”,它從 Unix 路徑名(以 分隔的組件/)和 DOS/Windows 路徑名(以 分隔的組件)中刪除了最後一個組件\。但…
  • \可能出現在 Unix 路徑名中。如果是這樣,那麼您的 sed 命令可能會給您帶來意想不到的結果。也允許使用換行符。
  • /是一個有效的路徑名,其父目錄是/. 但是,您的 sed 命令會產生一個空字元串。
  • If diris a directory then/path/to/dir/等價於/path/to/dir,但您的 sed 命令將分別產生/path/to/dir/path/to

引用自:https://unix.stackexchange.com/questions/699132