正規表現を使用したシェル変数の変更

正規表現を使用したシェル変数の変更

たとえば、シェル変数があります。 a = "大きな小さな男"。 bashで正規表現を使用して大文字の中間語のみを使用して変数を印刷するには? (大人と悪役)

変数を3つの変数に分割し、エコーで拡張するだけです。たとえば、などfirst=${a%* }。しかし、正規表現を使って一度にどうすればいいですか?

一行で可能ですか?大文字演算子(^)を使用してください。

答え1

sed

GNU sedを使用しているとします。

$ sed -E 's/(\w+) (\w+) (\w+)/\1 \U\2\E \3/' <<< 'big little man'
big LITTLE man

このコマンドは以下を使用します。GNU固有のシーケンス \U\E後続の文字をそれぞれ大文字に変換し、大文字と小文字の変換をキャンセルします。

アッ

正規表現では動作しませんが、awk個々の単語を大文字で表示する別の便利な方法を提供します。

$ awk '{print($1, toupper($2), $3)}' <<< 'big little man'
big LITTLE man

強く打つ

Bashにはデフォルトで正規表現ベースの変換はありませんが、文字列を配列として扱うことで部分大文字を取得できます。

$ (read -a words; echo "${words[0]} ${words[1]^^} ${words[2]}") <<< 'big little man'
big LITTLE man

これは^^、配列の2番目の要素(つまり2番目の単語)を大文字に変換します。この機能は Bash 4 で導入されました。

答え2

必要に応じて、bash次のコマンドを使用して1行でこれを行います${variable^^}

$ a="big little man"
$ [[ "$a" =~ ^([^ ]+)\ ([^ ]+)\ (.*) ]] && a="${BASH_REMATCH[1]} ${BASH_REMATCH[2]^^} ${BASH_REMATCH[3]}"
$ echo "$a"
big LITTLE man

これは正規表現([^ ]+)\ ([^ ]+)\ (.*)をの文字列と一致させます$a。一致するものがある場合は、スペースで区切られた3つの部分文字列が含まれます。最初と2番目の部分文字列はスペースを含まない文字列で、3番目の部分文字列は文字列の残りのビットです。

式が一致すると、$a値は大文字の2番目の部分文字列で上書きされます。

これは、元の文字列が空白ではなく文字で始まると仮定します。

答え3

bashスプレッド演算子を使用すると、一度にこれを実行できないと思います。zsh以下を使用できます。

set -o extendedglob # for (#m)

b=${a/(#m) * /${(U)MATCH}}

または:

b=${(S)a/(#b)(*) (*) (*)/$match[1] ${(U)match[2]} $match[3]}

どこ:

  • (#m)一致する文字列を使用できるようにします。$MATCH
  • (#b)逆参照を有効にする
  • ${(U)var}(また$var:u)は大文字で示されています(bashsより${var^^pattern}数十年前)。
  • (S)貪欲ではないマッチングをオンにします。

関連情報