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”。但也许有更好的方法。
用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)
一些可能更有效的变体,因为它们最大限度地减少了替换数量:
zsh
print -r -- ${message//(#b)((\\?)|([^\\]##))/$match[2]$match[3]:u}
Run Code Online (Sandbox Code Playgroud)
或者
print -r -- ${message//(#b)((\\?)#)([^\\]##)/$match[1]$match[3]:u}
Run Code Online (Sandbox Code Playgroud)
他们的 GNUsed
翻译:
printf '%s\n' "$message" | sed -E 's/(\\.)|([^\\]+)/\1\U\2/g'
Run Code Online (Sandbox Code Playgroud)
或者
printf '%s\n' "$message" | sed -E 's/((\\.)*)([^\\]+)/\1\U\3/g'
Run Code Online (Sandbox Code Playgroud)
请注意,它们会将(Meta-x,例如s\Mx
支持的转义序列,并扩展为 0xf8 字节 ('x' + 0x80))转换为(0xd8)。它们也转换为或到或到,但这应该不是问题,因为它们扩展为相同的。zsh
print
\MX
\x7a
\x7A
\u007a
\u007A
\Cx
\CX
归档时间: |
|
查看次数: |
865 次 |
最近记录: |