嘗試使用變數用 sed 將文本替換為另一個文本。它作業得很好,直到變數的內容包含一個破折號“-”并且 sed 嘗試解釋它。
需要注意的是,在這種情況下,我只需要替換源變數 ${src} 的最新出現,這就是為什么我的 sed 命令看起來像這樣:
sed -e "s:${source}([^${source}]*)$:${dest}\1:"
“sed”對我來說有點新,我總是盡可能用“replace”或“awk”得到結果,但在這里我試圖使代碼盡可能通用,因此使用sed。如果您想到另一種解決方案,那也是可行的。
問題示例:
# mkdir "/home/youruser/TEST-master"
# source="TEST-master" ; dest="test-master" ; find /home/youruser/ -depth -type d -name '*[[:upper:]]*' | grep "TEST" | sed -e "s:${source}([^${source}]*)$:${dest}\1:"
sed: -e expression #1, char 46: Invalid range end
鑒于我不知道每個變數可能包含多少個破折號,有沒有 sed 專家知道我怎樣才能做到這一點?
確切的背景關系:開源專案 LinuxGSM,我正在為它重寫一個函式來遞回地小寫檔案和目錄。我正在處理 Bash 功能并在此處發表評論:https : //github.com/GameServerManagers/LinuxGSM/issues/1868#issuecomment-996287057
uj5u.com熱心網友回復:
如果我正確理解背景關系,實際目標是采用在其最后一個元素中包含一些大寫字符的路徑,并創建一個最后一個元素小寫的版本。例如,/SoMe/PaTh/FiLeNaMe將轉換為/SoMe/PaTh/filename. 如果是這種情況,與其使用字串替換,不如使用dirname和basename將其拆分為多個組件,將最后一個大寫,然后重新組裝它:
parentdir=$(dirname "$src")
filename=$(basename "$src")
lowername=$(echo "${latestpath}" | tr '[:upper:]' '[:lower:]')
dst="$parentdir/$lowername"
(旁注:將引數參考到 很重要tr,以確保 shell 不會將它們視為檔案名通配符并將它們替換為匹配檔案的串列。)
只要路徑包含至少一個“/”但不以“/”結尾,您就可以使用 bash 替換來代替dirnameand basename:
parentdir="${src%/*}"
filename="${src##*/}"
只要您使用的是 bash v4.0 或更高版本,您還可以使用內置替換來進行小寫:
lowername="${filename,,}"
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/386426.html
上一篇:一行/一行中有多個下拉選單
