Linux

正則表達式,刪除最後一次出現“/”之後的所有字元

  • November 18, 2018

我在一個文件中有一個這樣的路徑名列表:

/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/\/[^/]*$/\//'

通過在正則表達式和替換字元串前面加上反斜杠 ( )\“轉義”作為正則表達式和替換字元串的斜杠。有些人發現這種“傾斜的樹木”叢林難以閱讀和維護,但這基本上歸結為風格問題。

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