Sed

使用 sed / bash 腳本刪除最後一次出現的變數

  • February 18, 2022

我有多個文件寫為 //// … /.h 或 .hpp。我需要獲取這些文件的目錄,而不是文件本身。有沒有什麼辦法,使用 sed,我可以做類似’find last / in line,然後刪除接下來的任何內容,直到 \n?\

PS:我知道 $ .* $ 或 (.*) 然後將第 i 個出現稱為 \i,但有沒有辦法告訴 sed 刪除 \i?\

編輯:

我通過執行類似的操作生成了一個文件

find . | grep *.h >> file ; find . | grep *.hpp >> file

我要處理的是這個文件的內容。

要獲取包含文件名後綴.h.hpp使用的文件的目錄find

find . -type f \( -name '*.h' -o -name '*.hpp' \) -exec dirname {} \;

這將查找名稱與兩個給定模式之一匹配的所有正常文件的路徑名。對於每個這樣的路徑名,該dirname實用程序用於提取路徑名的目錄路徑部分。

使用 GNU find,您可以改為

find . -type f \( -name '*.h' -o -name '*.hpp' \) -printf '%h\n'

這使用非標準列印帶有格式化選項-printf的路徑名(即目錄路徑)的“頭” 。%h

要獲得唯一的路徑名,您可以切換到查找目錄而不是文件:

find . -type d -exec bash -O nullglob -O dotglob -c '
   for pathname do
       set -- "$pathname"/*.{h,hpp}
       [[ $# -ne 0 ]] && printf "%s\n" "$pathname"
   done' bash {} +

bash這會為成批的目錄路徑名執行一個簡短的腳本。短腳本在啟用nullglobdotglobshell 選項的情況下執行,這意味著不匹配任何內容的通配模式將被刪除,通配模式也可能匹配隱藏的名稱。

該循環遍歷目前批次的路徑名,*.h*.hpp在每個目錄中擴展兩個 globbing 模式。如果模式匹配至少一個名稱,則輸出目錄的路徑名。

然而,最後一個變體將報告包含與名稱匹配的任何類型的文件的目錄,*.h或者*.hpp,而不僅僅是正常文件。


zsh外殼中:

typeset -U dirs=(./**/*.(h|hpp)(.ND:h))
print -r -C1 $dirs

dirs這將創建一個僅儲存唯一元素的數組變數。我們將它初始化為目前目錄下任意位置的目錄集,其中包含匹配*.hor的正常文件*.hpp,然後我們列印數組的內容。

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