我有這樣一個有效的bash單行程式,它使用sed將PascalCase轉換為kebab-case:
foo="TestPascalCaseString"/span>
echo $foo | sed -r 's/([a-z0-9])([A-Z])/1-2/g'/span> | tr ' [: upper:]' '[:lower:]' >。
輸出: test-pascal-case-string
然而,這是在一個腳本中使用的,該腳本需要在常見的Linux發行版、Windows上的WSL以及新舊版本的MacOS之間進行移植。
在舊版本的macOS上,該腳本失敗了:
在舊版本的macOS上,該腳本失敗了。
sed: illegal option -- r
我已經為任何macOS版本的用戶解決了這個問題,讓他們先brew install gsed,然后讓腳本使用gsed而不是sed。這很有效,但是Linux用戶沒有gsed二進制檔案,所以他們需要將腳本改回使用sed。
因此,我正試圖用一個純粹的bash解決方案來重新創建這個方案,或者用其他任何在所有平臺上一致作業的工具,以消除對前提工具安裝或腳本修改的需要。
我已經嘗試了bash的引數替換:
foo="TestPascalCaseString"。
echo ${foo//[A-Z]/-}
輸出。-est-ascal-ase-tring
這樣就把大寫字母替換成了連字符,但我不知道如何保留它所替換的大寫字母。
uj5u.com熱心網友回復:
用一個回圈,一個regex和bash版本>=3.0:
foo="TestPascalCaseString"/span>
while [[ "$foo" =~ (.*[a-z0-9])([A-Z]. *) ]] && foo="${BASH_REMATCH[1]}-${BASH_REMATCH[2]}"/span>; do
: # do nothing do : # do nothing
done :# do nothing
echo "${foo,,}"
輸出:
test-pascal-case-string
uj5u.com熱心網友回復:
使用perl(我99%確定OS X仍然配備了它):
$perl -ne 'print lc s/[[: lower:]d]K[[:upper:]]/-$&/rg' <<<"TestPascalCaseString"/span>
test-pascal-case-string
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/332470.html
標籤:
