我在使用簡短的 bash 腳本時遇到了問題。似乎所有正斜杠都需要轉義。在 perl 讀取它們之前,如何對擴展(環境)變數中的必需字符進行轉義?或者其他一些 perl 理解的方法。
這就是我想要做的,但這不會正常作業。
eval "perl -pi -e 's/$HOME\/_TV_rips\///g'" '*$videoID.info.json'
這是一個較長腳本的一部分,其中videoID=$1. (出于某種原因,perl 擴展了單引號和雙引號內的變數。)
這種在擴展環境變數中沒有正斜杠的簡單解決方法$USER有效。但我不想/Users/硬編碼:
eval "perl -pi -e 's/\/Users\/$USER\/_TV_rips\///g'" '*$videoID.info.json'
這可能可以通過某種更好的方式來解決,即為檔案或其他東西獲取主目錄。目標是洗掉 youtube-dl 的 json 資料中的檔案夾名稱。我使用 perl 只是因為它可以處理擴展的正則運算式。但是 perl 不是必需的。歡迎在 macOS 上使用任何更好的擴展正則運算式替代品。
uj5u.com熱心網友回復:
您正在構建以下 Perl 程式:
s//home/username\/_TV_rips\///g
這是相當錯誤的。
您不應該首先嘗試從 shell 構建 Perl 代碼。有幾種方法可以將值傳遞給 Perl 代碼,而不是生成 Perl 代碼。由于該值在環境中很方便,我們可以使用
perl -i -pe's/\Q$ENV{HOME}\E\/_TV_rips\///' *"$videoID.info.json"
或者更好
perl -i -pe's{\Q$ENV{HOME}\E/_TV_rips/}{}' *"$videoID.info.json"
(另請注意evalglob 上缺少和固定的參考。)
uj5u.com熱心網友回復:
只需在評論中組合想法,這應該達到您的預期:
perl -pi -e 's{$ENV{HOME}/_TV_rips/}{}g' *$videoID.info.json
@ikegami 感謝您的評論!使用 \Q...\E 確實更安全,以防 $HOME 包含像 $ 這樣的字符。
uj5u.com熱心網友回復:
所有正則運算式分隔符必須在輸入字串中轉義。
但正如 Stefen 所說,您可以在 perl 中使用其他分隔符,例如%, §.
特殊的角色
#Perl 注釋 - 不要使用這個?,[], {}, $, ^, .正則運算式控制字符 - 必須在正則運算式中轉義。如果您的字串中有很多斜杠,這會更容易。
您應該始終撰寫注釋以明確您使用的是不同的分隔符,因為這會使您的正則運算式對于沒有經驗的用戶來說難以閱讀。
在此處試用您的 RegEx:https : //regex101.com/r/cIWk1o/1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/344829.html
