Sed
使用 sed / bash 腳本刪除最後一次出現的變數
我有多個文件寫為 //// … /.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
這會為成批的目錄路徑名執行一個簡短的腳本。短腳本在啟用nullglob
和dotglob
shell 選項的情況下執行,這意味著不匹配任何內容的通配模式將被刪除,通配模式也可能匹配隱藏的名稱。該循環遍歷目前批次的路徑名,
*.h
並*.hpp
在每個目錄中擴展兩個 globbing 模式。如果模式匹配至少一個名稱,則輸出目錄的路徑名。然而,最後一個變體將報告包含與名稱匹配的任何類型的文件的目錄,
*.h
或者*.hpp
,而不僅僅是正常文件。在
zsh
外殼中:typeset -U dirs=(./**/*.(h|hpp)(.ND:h)) print -r -C1 $dirs
dirs
這將創建一個僅儲存唯一元素的數組變數。我們將它初始化為目前目錄下任意位置的目錄集,其中包含匹配*.h
or的正常文件*.hpp
,然後我們列印數組的內容。