私が見つけた方法は改行に影響を与え、行をさらに分割します。
たとえば...
$ message="First Line\nSecond Line";
$ echo "${message^^}"
FIRST LINE\NSECOND LINE
文字列を大文字に変換しますが、エスケープ文字を保持して次の出力を得るエレガントな方法はありますか?
FIRST LINE\nSECOND LINE
「\n」を0001に変更したり、変換を適用してから0001を「\n」に返すなど、複雑な操作を実行できます。しかし、より良い方法があるかもしれません。
ベストアンサー1
zsh
代わりに使用してくださいbash
:
$ message="First Line\nSecond Line"
$ set -o extendedglob
$ print -r -- ${message//(#b)((\\?)|(?))/$match[2]$match[3]:u}
FIRST LINE\nSECOND LINE
(またはその問題に対するすべてのシェル)でbash
GNU実装を使用すると、sed
同じことができます。
$ printf '%s\n' "$message" | sed -E 's/(\\.)|(.)/\1\u\2/g'
FIRST LINE\nSECOND LINE
代替回数を最小限に抑えるため、より効率的になるいくつかのバリエーションは次のとおりです。
zsh
print -r -- ${message//(#b)((\\?)|([^\\]##))/$match[2]$match[3]:u}
または
print -r -- ${message//(#b)((\\?)#)([^\\]##)/$match[1]$match[3]:u}
GNU
sed
翻訳:printf '%s\n' "$message" | sed -E 's/(\\.)|([^\\]+)/\1\U\2/g'
または
printf '%s\n' "$message" | sed -E 's/((\\.)*)([^\\]+)/\1\U\3/g'
\Mx
(sでサポートされ、0xf8バイト( 'x' + 0x80)に拡張されたエスケープシーケンスなどのMeta-x)を(0xd8)に変換します。それらも or に変換しますが、同じように拡張されるので問題になりません。zsh
print
\MX
\x7a
\x7A
\u007a
\u007A
\Cx
\CX