我有以下字串:abcd=efgh并且我想將 to 之前的所有字符=大寫ABCD=efgh。
在閱讀了一堆帖子后,我嘗試了以下方法:
echo "abcd=efgh" | sed -r 's/^(.*)=/\U\1\E=/'
但這會回傳:
UabcdE=efgh
因此,使用該命令,我可以捕獲正確的組,但\U不會大寫捕獲組。任何想法?謝謝!
uj5u.com熱心網友回復:
正如您所發現的,您遇到了 GNU sed 和 BSD sed 之間的區別;后者是 macOS 上的內容。如果您安裝 GNU sed(例如 Homebrewgnu-sed軟體包)并使用它(可能安裝為gsed),那么您最初的嘗試將起作用。
更便攜的解決方案是使用 perl。您的原始sed運算式保持不變:
$ echo "abcd=efgh" | perl -pe 's/^(.*)=/\U\1\E=/'
ABCD=efgh
雖然我會稍微簡化一下運算式并echo |用這里的字串替換:
$ perl -pe 's/^[^=]*/\U$&/' <<<'abcd=efgh'
ABCD=efgh
您可以使用其他工具,但它們不會像 perl 那樣使用與 sed 相同的語法。例如,您可以使用 shell 內置函式來拆分字串,然后tr在要大寫的一半上運行:
IFS== read left right <<<abcd=efgh
printf '%s=%s\n' "$(tr a-z A-Z <<<"$left")" "$right"
如果您使用的是 zsh,則可以使用其內置的大寫擴展來代替tr:
IFS== read left right <<<abcd=efgh
printf '%s=%s\n' "${(U)left}" "$right"
較新的 bash 版本也可以做到這一點,但不是 macOS 上 /bin/ 中附帶的那個。您必須安裝一個較新的(例如再次使用 Homebrew),然后才能正常作業:
IFS== read left right <<<abcd=efgh
printf '%s=%s\n' "${left^^}" "$right"
uj5u.com熱心網友回復:
很多解決方案。這里一個使用awk:
awk -F= '{print toupper($1) "=" $2}' <<< 'abcd=efgh'
ABCD=efgh
uj5u.com熱心網友回復:
這可能對您有用(GNU sed):
sed 'h;y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/;G;s/=.*=/=/' file
復制當前行。
將所有小寫字母轉換為大寫字母。
附加原始行的副本。
=從to中洗掉兩行的部分=并將其替換為=.
選擇:
sed 's/.*=/\U&/' file
uj5u.com熱心網友回復:
使用sed,替代\u選項應該可以作業。
$ sed ':a;s/[a-z]\ =/\u&/;ta;' input_file
ABCD=efgh
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/487317.html
