特定の単語のみを小文字に変換

特定の単語のみを小文字に変換

var値が . の変数があるとしますfOo bar1 baR2 bArab

lc_varたとえば、最初の単語を除くすべての単語を小文字に変換されたバージョンなど、別の変数に保存するにはどうすればよいですか?var

私はそれが適切なAWKまたはsedコマンドで置き換えられるように見えるかもlc_var=$(echo $var | ...)しれません。...

答え1

シェルを含むzsh:

set -o extendedglob
lc_var=${var/%(#m) */${(L)MATCH}}

kshは、${var/%pattern/replacement}一致するvarの末尾をに置き換えて、一致する部分(つまり、必須部分)を保存して小文字に変換します。patternreplacement(#m)$MATCHextendedglob${(L)MATCH}$MATCH

シェルを含むbash:

tmp1=${var%% *}
tmp2=${var#"$tmp1"}
lc_var=$tmp1${tmp2,,}

POSIXlyでは、次のようにします。

lc_var=$(
  awk '
    BEGIN{
      var = ARGV[1]
      if (i = index(var, " "))
        var = substr(var, 1, i) tolower(substr(var, i + 1))
      print var "."
    }' "$var"
)
lc_var=${lc_var%.}

とにかく、これはPOSIX / Korn / bash / zshシェル構文lc_var=$(echo $var ...)のために不可能に見え、$(...)そのシェルではecho任意のデータを出力できませんそして変数拡張を引用する必要があります。(多分除くzsh)。

これらすべてのバリアントは、最初の空白文字の後のすべての文字を小文字に変換します$var(どの文字であるかを想定せずに)。単語がスペース以外の文字で区切られたり、最初の単語の前に単語区切り文字がある場合は、それを調整する必要があります。

答え2

そしてbash

var='fOo bar1 baR2 bArab'
tail=${var#* }; lc_var="${var%% *} ${tail,,}"
echo "$lc_var"

fOo bar1 bar2 barab

機能として:

set_lc(){ declare -n v=$1; declare t=${2#* }; v="${2%% *} ${t,,}"; }

または:

set_lc(){ typeset -n _v=$1; typeset h=${2%% *}; typeset -l t=${2#"$h"}; _v=$h$t; }

(この2番目のバージョンも機能する必要があり、ksh単一の単語で構成される引数を処理します)

set_lc var 'FOO BAR BAZ'
echo "$var"

FOO bar baz

Bashの奇妙で制限されたパラメータ拡張に関する追加情報修飾子そして薬ステートメント/組版カーニバルから手動

答え3

次の解決策はGNU sedを使用しており、bashでのみテストされています。変数に複数行のテキストが含まれている場合でも機能します。

lc_var="$(printf "%s\n" "$var"|sed ':l;$!{N;bl};s:\s.*:\L&.:')"
lc_var="${lc_var%.}"

echo、sed -z、コマンドの置換など、極端なケースについて議論した@Stéphane Chazelasに感謝します。

答え4

lc_var=$(echo $var | sed 's/^\([^ ]*\)\(.*\)/\1\L\2/g')

(少しの助けを借りてhttp://timmerphy.org/2013/02/24/converting-to-uppercase-lowercase-in-sed/)

関連情報