转换为大写,转义字符除外

Oce*_*ean 5 bash escape-characters

我发现的方法还通过影响换行符来进一步破坏线路。
例如...

$ message="First Line\nSecond Line"; 
$ echo "${message^^}"
FIRST LINE\NSECOND LINE
Run Code Online (Sandbox Code Playgroud)

是否有一种优雅的方法将字符串转换为大写,但保留转义字符,以获得以下输出?

FIRST LINE\nSECOND LINE
Run Code Online (Sandbox Code Playgroud)

我可以做一些复杂的事情,比如将“\n”更改为 0001 或类似的操作,应用转换,然后将 0001 返回到“\n”。但也许有更好的方法。

Sté*_*las 6

zsh而不是bash

$ message="First Line\nSecond Line"
$ set -o extendedglob
$ print -r -- ${message//(#b)((\\?)|(?))/$match[2]$match[3]:u}
FIRST LINE\nSECOND LINE
Run Code Online (Sandbox Code Playgroud)

bash(或任何 shell)中,使用 的 GNU 实现sed,您可以执行相同的操作:

$ printf '%s\n' "$message" | sed -E 's/(\\.)|(.)/\1\u\2/g'
FIRST LINE\nSECOND LINE
Run Code Online (Sandbox Code Playgroud)

一些可能更有效的变体,因为它们最大限度地减少了替换数量:

请注意,它们会将(Meta-x,例如s\Mx支持的转义序列,并扩展为 0xf8 字节 ('x' + 0x80))转换为(0xd8)。它们也转换为或到或到,但这应该不是问题,因为它们扩展为相同的。zshprint\MX\x7a\x7A\u007a\u007A\Cx\CX