특정 단어만 소문자로 변환

특정 단어만 소문자로 변환

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; }

(이 두 번째 버전도 작동해야 하며 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/)

관련 정보