bash - 使用 sed 将 "="之前的所有字符大写

我有以下字符串: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/

相关文章:

c - 打包的相同结构是否保证具有相同的内存布局?

regex - 用awk模拟 "grep -oE"的停止条件

laravel - "npm run watch"不工作并返回错误 's saying ' 缺少 "

regex - 有没有办法匹配句子中所有相邻的单词?

python - 并行运行两个嵌套的 for 循环以创建矩阵

sql - 从逗号分隔的值列表构建 where 子句

javascript - 错误 : Text content does not match serv

python-3.x - 在python中将字符串写入文本文件

c - 函数参数在 C 中表现异常

regex - 我在我的 CI/CD 设置中找不到 Gitlab 的测试覆盖解析设置