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の末尾をに置き換えて、一致する部分(つまり、必須部分)を保存して小文字に変換します。pattern
replacement
(#m)
$MATCH
extendedglob
${(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/)