Linux
正則表達式,刪除最後一次出現“/”之後的所有字元
我在一個文件中有一個這樣的路徑名列表:
/path/to/directory/one.txt /longer/path/to/some/directory/two.py /path/with spaces/in/it/three.sh
我想刪除最後一次出現“/”之後的所有字元,因此上述所需的輸出是:
/path/to/directory/ /longer/path/to/some/directory/ /path/with spaces/in/it/
sed 's![^/]*$!!'
這將執行以下操作:
- 使用除 之外的分隔符
/
,因為正則表達式包含/
. (我喜歡!
and|
因為它們看起來像分割線;其他人使用@
,#
,^
或任何他們喜歡的東西。可以/
在由 分隔的正則表達式中使用/
,但這對於一個人來說可能很難閱讀。)- 查找除 之外的(零個或多個)字元的字元串
/
。(盡可能長。)但它必須在行尾。- 並將其替換為空。
警告:不包含
/
字元的輸入行將被完全刪除(即,該行的全部內容將被刪除,只留下一個空白行)。如果我們想解決這個問題,並且讓沒有斜杠的行保持不變,我們可以將命令更改為sed 's!/[^/]*$!/!'
這與第一個答案相同,除了它匹配最後一個字元
/
和它之後的所有字元,然後用 a 替換它們/
(實際上,將最後/
一個字元單獨留在輸入行中)。因此,在第一個答案找到one.txt
並將其替換為空的地方,它會找到/one.txt
並將其替換為/
. 但是,在不包含/
字元的行上,第一個答案匹配整行並將其替換為空,而這個答案找不到匹配項,因此不會進行替換。我們可以
/
在此命令中用作分隔符,但它必須是sed 's/\/[^/]*$/\//'
通過在正則表達式和替換字元串前面加上反斜杠 ( )來
\
“轉義”作為正則表達式和替換字元串的斜杠。有些人發現這種“傾斜的樹木”叢林難以閱讀和維護,但這基本上歸結為風格問題。