エスケープ文字を除いて大文字に変換

エスケープ文字を除いて大文字に変換

私が見つけた方法は改行に影響を与え、行をさらに分割します。
たとえば...

$ 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

(またはその問題に対するすべてのシェル)でbashGNU実装を使用すると、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}
    
  • GNUsed翻訳:

    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 に変換しますが、同じように拡張されるので問題になりません。zshprint\MX\x7a\x7A\u007a\u007A\Cx\CX

おすすめ記事