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; }
(이 두 번째 버전도 작동해야 하며 ksh
단일 단어로 구성된 인수를 처리합니다)
set_lc var 'FOO BAR BAZ'
echo "$var"
FOO bar baz
답변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/)