我有以下字符串:abcd=efgh
我想将 =
之前的所有字符大写以获得 ABCD=efgh
。
看了一堆帖子后,我尝试了以下方法:
echo “abcd=efgh” | sed -r 's/^(.*)=/\U\1\E=/'
但这会返回:
UabcdE=efgh
因此,通过命令,我可以捕获正确的组,但 \U
不会将捕获组大写。
任何想法?谢谢!
最佳答案
正如您所发现的,您遇到了 GNU sed 和 BSD sed 之间的区别;后者是 macOS 上提供的。如果您安装 GNU sed(例如 Homebrew gnu-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"
关于bash - 使用 sed 将 "="之前的所有字符大写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72493835/