Regular-Expression
正則表達式如何///^/^/^/*$ 工作?
我有一些有用的正則表達式的註釋,我經常使用的註釋如下:
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|…|…|
.)- 從某種意義上說,您的命令似乎是“通用的”,它從 Unix 路徑名(以 分隔的組件
/
)和 DOS/Windows 路徑名(以 分隔的組件)中刪除了最後一個組件\
。但…\
可能出現在 Unix 路徑名中。如果是這樣,那麼您的 sed 命令可能會給您帶來意想不到的結果。也允許使用換行符。/
是一個有效的路徑名,其父目錄是/
. 但是,您的 sed 命令會產生一個空字元串。- If
dir
is a directory then/path/to/dir/
等價於/path/to/dir
,但您的 sed 命令將分別產生/path/to/dir
和/path/to
。