使用sed将等号前所有字符转为大写时\U不生效如何解决
问题原因
你写的sed命令逻辑本身没有问题,\U、\E是GNU版本sed专属的替换语法,作用是把后续匹配到的字符转大写、直到遇到\E终止。出现UabcdE=efgh的输出,是因为你当前环境用的是BSD版sed(比如macOS系统默认自带的sed),这个版本不识别GNU扩展的转义标记,会把\U里的U、\E里的E当成普通字符直接输出。
可用调整方案
根据你当前的环境选对应方案即可:
- 方案1:调用GNU sed执行原命令
绝大多数Linux发行版默认预装的就是GNU sed,原命令可以直接运行得到正确结果。如果是在macOS环境,先通过homebrew安装GNU sed(包名gnu-sed),安装完成后用gsed命令替换原命令里的sed即可:
执行后直接输出echo "abcd=efgh" | gsed -r 's/^(.*)=/\U\1\E=/'ABCD=efgh。 - 方案2:用POSIX标准兼容的awk实现,全平台通用
如果不想区分sed版本,用awk实现是最稳妥的,所有类Unix系统自带的awk都支持内置的toupper()大写转换函数,命令如下:
逻辑是用echo "abcd=efgh" | awk -F'=' -v OFS='=' '{ $1 = toupper($1); print $0 }'=作为输入、输出的字段分隔符,把第一个字段(也就是=号前的内容)转成大写后整体打印,不需要依赖任何工具的扩展语法。
注意:BSD版原生sed没有内置大小写转换的相关语法,不建议硬写纯BSD sed的实现,可读性和可移植性都很差。
内容的提问来源于stack exchange,提问作者astiegler
相关产品推荐
相关产品推荐

