බාෂ් හි නූලක් කුඩා අකුරක් බවට පරිවර්තනය කරන්නේ කෙසේද?


1273

ඇතුළට ක්‍රමයක් තියෙනවද? නූලක් කුඩා අකුරු බවට පරිවර්තනය කිරීමට?

උදාහරණයක් ලෙස, මට තිබේ නම්:

a="Hi all"

මට එය පරිවර්තනය කිරීමට අවශ්‍යයි:

"hi all"

1
මෙයද බලන්න : stackoverflow.com/questions/11392189
dreftymac

Answers:


2230

විවිධ ක්‍රම:

POSIX ප්‍රමිතිය

tr

$ echo "$a" | tr '[:upper:]' '[:lower:]'
hi all

AWK

$ echo "$a" | awk '{print tolower($0)}'
hi all

POSIX නොවන

ඔබට පහත උදාහරණ සමඟ අතේ ගෙන යා හැකි ගැටළු වලට මුහුණ දිය හැකිය:

බෑෂ් 4.0

$ echo "${a,,}"
hi all

sed

$ echo "$a" | sed -e 's/\(.*\)/\L\1/'
hi all
# this also works:
$ sed -e 's/\(.*\)/\L\1/' <<< "$a"
hi all

පර්ල්

$ echo "$a" | perl -ne 'print lc'
hi all

බාෂ්

lc(){
    case "$1" in
        [A-Z])
        n=$(printf "%d" "'$1")
        n=$((n+32))
        printf \\$(printf "%o" "$n")
        ;;
        *)
        printf "%s" "$1"
        ;;
    esac
}
word="I Love Bash"
for((i=0;i<${#word};i++))
do
    ch="${word:$i:1}"
    lc "$ch"
done

සටහන: මේ මත YMMV. භාවිතා කිරීම සමඟ වුවද (GNU bash වෙළුම 4.2.46 සහ 4.0.33 (සහ එකම හැසිරීම 2.05b.0 නමුත් nocasematch ක්‍රියාත්මක නොවේ)) මට වැඩ නොකරයි shopt -u nocasematch;. Nocasematch [["fooBaR" == "FOObar"]] හරි ගැලපීමට හේතු වන බව සැකසීම, නමුත් නඩුව ඇතුළත අමුතු ලෙස [bz] [AZ] විසින් වැරදියට ගැලපේ. ද්විත්ව negative ණ ("සැකසීමේ නොකාස්මැච්") මගින් බාෂ් ව්‍යාකූල වේ! :-)


9
මට යමක් මග හැරී තිබේද, නැතහොත් ඔබේ අවසාන උදාහරණය (බාෂ් හි) ඇත්ත වශයෙන්ම සම්පූර්ණයෙන්ම වෙනස් දෙයක් කරයිද? එය "ABX" සඳහා ක්රියාත්මක වන නමුත් ඔබට ඒ වෙනුවට කරන්න නම් word="Hi All"අනෙක් උදාහරණ මෙන්, එය නැවත haනැහැ, hi all. එය ක්‍රියාත්මක වන්නේ ලොකු අකුරු සඳහා පමණක් වන අතර දැනටමත් අඩු අකුරු මඟ හැරේ.
jangosteve

26
POSIX ප්‍රමිතියේ දක්වා ඇත්තේ trසහ awkඋදාහරණ පමණක් බව සලකන්න .
රිචඩ් හැන්සන්

179
tr '[:upper:]' '[:lower:]'ලොකු අකුරු / සිම්පල් සමානකම් තීරණය කිරීම සඳහා වත්මන් පෙදෙසි භාවිතා කරනු ඇත, එබැවින් එය අක්ෂර ලකුණු සහිත අක්ෂර භාවිතා කරන ස්ථාන සමඟ ක්‍රියා කරයි.
රිචඩ් හැන්සන්

12
යමෙකු නව විචල්‍යයකට ප්‍රතිදානය ලබා ගන්නේ කෙසේද? එනම්, මට කුඩා අකුරු නව විචල්‍යයකට අවශ්‍යද?
ඇඩම් පාකින්

61
D ඇඩම්:b="$(echo $a | tr '[A-Z]' '[a-z]')"
ටිනෝ

441

Bash 4 හි:

සිම්පල් කිරීමට

$ string="A FEW WORDS"
$ echo "${string,}"
a FEW WORDS
$ echo "${string,,}"
a few words
$ echo "${string,,[AEIUO]}"
a FeW WoRDS

$ string="A Few Words"
$ declare -l string
$ string=$string; echo "$string"
a few words

ලොකු අකුරට

$ string="a few words"
$ echo "${string^}"
A few words
$ echo "${string^^}"
A FEW WORDS
$ echo "${string^^[aeiou]}"
A fEw wOrds

$ string="A Few Words"
$ declare -u string
$ string=$string; echo "$string"
A FEW WORDS

ටොගල් කරන්න (ලේඛනගත නොකළ, නමුත් සම්පාදනය කරන වේලාවේදී විකල්ප ලෙස වින්‍යාසගත කළ හැකිය)

$ string="A Few Words"
$ echo "${string~~}"
a fEW wORDS
$ string="A FEW WORDS"
$ echo "${string~}"
a FEW WORDS
$ string="a few words"
$ echo "${string~}"
A few words

ප්‍රාග්ධනීකරණය (ලේඛනගත නොකළ, නමුත් සම්පාදනය කරන වේලාවේදී විකල්ප ලෙස වින්‍යාසගත කළ හැකිය)

$ string="a few words"
$ declare -c string
$ string=$string
$ echo "$string"
A few words

මාතෘකාව:

$ string="a few words"
$ string=($string)
$ string="${string[@]^}"
$ echo "$string"
A Few Words

$ declare -c string
$ string=(a few words)
$ echo "${string[@]}"
A Few Words

$ string="a FeW WOrdS"
$ string=${string,,}
$ string=${string~}
$ echo "$string"
A few words

declareලක්ෂණයක් අක්‍රිය කිරීමට , භාවිතා කරන්න +. උදාහරණයක් ලෙස , declare +c string. මෙය පසුකාලීන පැවරුම් වලට බලපාන අතර වර්තමාන වටිනාකමට නොවේ.

මෙම declareවිකල්ප එකේම ආරෝපණය, නමුත් අන්තර්ගතය වෙනස් කරන්න. මගේ උදාහරණවල නැවත පැවරීම් වෙනස්කම් පෙන්වීමට අන්තර්ගතය යාවත්කාලීන කරයි.

සංස්කරණය කරන්න:

Ghostdog74${var~} විසින් යෝජනා කර ඇති පරිදි "පළමු අක්‍ෂරය වචනයෙන් ටොගල් කරන්න" ( ) එකතු කරන ලදි .

සංස්කරණය කරන්න: බාෂ් 4.3 ට ගැලපෙන පරිදි නිවැරදි ටිල්ඩ් හැසිරීම.


5
තරමක් බිස්සරේ, "^^" සහ ",," ක්‍රියාකරුවන් ASCII නොවන අක්ෂර මත ක්‍රියා නොකරන නමුත් "~~" එසේ කරයි ... එබැවින් string="łódź"; echo ${string~~}"ŁÓDŹ" ආපසු එනු ඇත, නමුත් echo ${string^^}"łóDź" නැවත ලබා දේ. ඇතුළත පවා LC_ALL=pl_PL.utf-8. එය bash 4.2.24 භාවිතා කරයි.
හියුබට් කාරියෝ

2
Ub හියුබට් කාරියෝ: ඒක අමුතුයි. Bash 4.0.33 හි එකම නූලක් සහිතව මට එය එසේම වේ en_US.UTF-8. එය දෝෂයක් වන අතර මම එය වාර්තා කළෙමි.
වැඩිදුර දැනුම් දෙන තුරු විරාමය.

1
Ub හියුබට් කාරියෝ: උත්සාහ කරන්න echo "$string" | tr '[:lower:]' '[:upper:]'. එය බොහෝ විට එකම අසාර්ථකත්වය පෙන්නුම් කරනු ඇත. එබැවින් ගැටළුව අවම වශයෙන් අර්ධ වශයෙන් බාෂ්ගේ නොවේ.
වැඩිදුර දැනුම් දෙන තුරු විරාමය.

1
Enn ඩෙනිස්විලියම්සන්: ඔව්, මමත් එය දුටුවා (ෂුවාලොව්ගේ පිළිතුරට අදහස් දැක්වීම බලන්න). මම කියන්නේ, "මේ දේවල් ASCII සඳහා පමණයි", නමුත් පසුව එය ක්‍රියා කරන්නේ "~~" ක්‍රියාකරු නිසා කේත සහ පරිවර්තන වගු දැනටමත් එහි නොමැති බව නොවේ ...
හියුබට් කාරියෝ

4
Ub හියුබට් කාරියෝ: බෑෂ් නඩත්තුකරු විසින් දෝෂය පිළිගෙන ඇති අතර එය ඊළඟ නිකුතුවේදී නිවැරදි කරන බව ප්‍රකාශ කර ඇත.
වැඩිදුර දැනුම් දෙන තුරු විරාමය.

124
echo "Hi All" | tr "[:upper:]" "[:lower:]"

4
Ic රිචඩ් හැන්සන්: trACII නොවන චරිත සඳහා මට වැඩ නොකරයි. මා සතුව නිවැරදි ස්ථාන කට්ටලයක් සහ ස්ථානීය ගොනු ජනනය කර ඇත. මා වැරදි කරන්නේ කුමක් දැයි යම් අදහසක් තිබේද?
හියුබට් කාරියෝ

FYI: මෙය වින්ඩෝස් / එම්එස්එස් හි වැඩ කළා. තවත් සමහර යෝජනා එසේ නොවීය.
කෝඩිබ්‍රවුන්

3
[:upper:]අවශ්‍ය වන්නේ ඇයි ?
mgutt

77

tr :

a="$(tr [A-Z] [a-z] <<< "$a")"

AWK :

{ print tolower($0) }

sed :

y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/

2
+1 a="$(tr [A-Z] [a-z] <<< "$a")"මට පහසුමයි මම තවමත් ආරම්භකයෙක් ...
සන්දීපන් නාත්

2
sedවිසඳුම මම තරයේ නිර්දේශ කරමි ; මම පරිසරයක වැඩ කර තියෙනවා යම් හේතුවක් නිසා ඇති නොවන බව trමම තොරව පද්ධතිය සොයා ගැනීමට තවමත් තියෙනවා sed, ප්ලස් මම මේ දැන් වෙන දෙයක් කරලා තියෙන්නෙ මම මේ කරන්න ඕන කාලය ගොඩක් sedඑසේ හැකි දාම කෙසේ හෝ විධාන එකට එක් (දිගු) ප්‍රකාශයකට.
හරාවික්

2
වරහන් ප්‍රකාශන උපුටා දැක්විය යුතුය. තුළ tr [A-Z] [a-z] A, තනි අකුරකින් හෝ ශුන්‍ය ගොබයක් සකසා ඇති ගොනු නාම තිබේ නම්, කවචය ගොනු නාම පුළුල් කිරීම සිදු කරයි . tr "[A-Z]" "[a-z]" Aනිසි ලෙස හැසිරෙනු ඇත.
ඩෙනිස්

2
Am කැමිලෝමාර්ටින් එය කාර්යබහුල බොක්ස් පද්ධතියකි, එහිදී මට එම ගැටලුව තිබේ, විශේෂයෙන් සයිනොලොජි නාස්, නමුත් මට එය වෙනත් පද්ධති කිහිපයකම හමු විය. මම මෑතකදී හරස් වේදිකා ෂෙල් ස්ක්‍රිප්ටින් ගොඩක් කර ඇති අතර, අමතර කිසිවක් ස්ථාපනය නොකිරීමේ අවශ්‍යතාවය නිසා එය දේවල් ඉතා ව්‍යාකූල කරයි! කෙසේ වෙතත් මට තවම පද්ධතියක් හමු වී නැතsed
හරාවික්

2
tr [A-Z] [a-z]සෑම ප්‍රදේශයකම පාහේ වැරදි බව සලකන්න . උදාහරණයක් ලෙස, en-USපෙදෙසෙහි, A-Zඇත්ත වශයෙන්ම අන්තරය AaBbCcDdEeFfGgHh...XxYyZවේ.
fuz

45

මෙය පැරණි පෝස්ට් එකක් බව මම දනිමි, නමුත් මම මෙම පිළිතුර වෙනත් වෙබ් අඩවියකට ඉදිරිපත් කළෙමි, එබැවින් මම එය මෙහි පළ කිරීමට සිතුවෙමි:

UPPER -> පහළ : පයිතන් භාවිතා කරන්න:

b=`echo "print '$a'.lower()" | python`

හෝ රූබි:

b=`echo "print '$a'.downcase" | ruby`

හෝ පර්ල් (බොහෝ විට මගේ ප්‍රියතම):

b=`perl -e "print lc('$a');"`

හෝ PHP:

b=`php -r "print strtolower('$a');"`

හෝ අවුල්:

b=`echo "$a" | awk '{ print tolower($1) }'`

හෝ සෙඩ්:

b=`echo "$a" | sed 's/./\L&/g'`

හෝ Bash 4:

b=${a,,}

හෝ ඔබට එය තිබේ නම් NodeJS (සහ ටිකක් ගෙඩි වේ ...):

b=`echo "console.log('$a'.toLowerCase());" | node`

ඔබට ද භාවිතා කළ හැකිය dd(නමුත් මම එසේ නොකරමි!):

b=`echo "$a" | dd  conv=lcase 2> /dev/null`

පහළ -> UPPER :

පයිතන් භාවිතා කරන්න:

b=`echo "print '$a'.upper()" | python`

හෝ රූබි:

b=`echo "print '$a'.upcase" | ruby`

හෝ පර්ල් (බොහෝ විට මගේ ප්‍රියතම):

b=`perl -e "print uc('$a');"`

හෝ PHP:

b=`php -r "print strtoupper('$a');"`

හෝ අවුල්:

b=`echo "$a" | awk '{ print toupper($1) }'`

හෝ සෙඩ්:

b=`echo "$a" | sed 's/./\U&/g'`

හෝ Bash 4:

b=${a^^}

හෝ ඔබට එය තිබේ නම් NodeJS (සහ ටිකක් ගෙඩි වේ ...):

b=`echo "console.log('$a'.toUpperCase());" | node`

ඔබට ද භාවිතා කළ හැකිය dd(නමුත් මම එසේ නොකරමි!):

b=`echo "$a" | dd  conv=ucase 2> /dev/null`

ඔබ 'ෂෙල්' යැයි පැවසූ විට මම හිතන්නේ ඔබ අදහස් කළේ bashනමුත් ඔබට එය භාවිතා කළ හැකි නම් zshඑය පහසු ය

b=$a:l

කුඩා අකුරු සඳහා සහ

b=$a:u

ඉහළ නඩුව සඳහා.


ESJESii දෙකම මා වෙනුවෙන් වැඩ කරන්නේ ඉහළ -> පහළ සහ පහළ-> ඉහළ ය. මම 64bit ඩෙබියන් ස්ට්රෙච් මත sed 4.2.2 සහ Bash 4.3.42 (1) භාවිතා කරමි.
nettux

1
හායි, @ nettux443 ... මම යළිත් වරක් බාෂ් මෙහෙයුම උත්සාහ කළ අතර එය "නරක ආදේශනය" යන දෝෂ පණිවිඩය සමඟ තවමත් මට අසමත් වේ. මම ඕඑස්එක්ස් හි හෝම්බ rew බෑෂ් භාවිතා කරමි: ග්නූ බෑෂ්, 4.3.42 (1) අනුවාදය - මුදා හැරීම (x86_64-ඇපල්-ඩාර්වින් 14.5.0)
ජේසී

5
පාවිච්චි කරන්න එපා! පිටපතක් ජනනය කරන සියලුම උදාහරණ අතිශයින්ම අස්ථාවර ය; වටිනාකමෙහි aඑක් උපුටා දැක්වීමක් තිබේ නම්, ඔබට බිඳුණු හැසිරීම පමණක් නොව බරපතල ආරක්ෂක ගැටළුවක් ද ඇත.
ත්‍රිත්ව

Sed සෑම විටම සර්වසම්පූර්ණ බැවින් මම වැඩිපුරම sed විසඳුමට කැමතියි.
ඩූඩි බෝයි

මම කැමතියි ඩීඩී ද්‍රාවණය භාවිතා කිරීමට. එය ක්‍රියාත්මක කිරීම සඳහා ඔබ මුල විය යුතු බව කරුණාවෙන් සලකන්න
inetphantom


18

GNU භාවිතා කිරීම sed:

sed 's/.*/\L&/'

උදාහරණයක්:

$ foo="Some STRIng";
$ foo=$(echo "$foo" | sed 's/.*/\L&/')
$ echo "$foo"
some string

13

පෙර බෑෂ් 4.0

Bash නූලක නඩුව අඩු කර විචල්‍යයට පවරන්න

VARIABLE=$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]') 

echo "$VARIABLE"

5
echoපයිප්ප අවශ්‍ය නොවේ : භාවිතා කරන්න$(tr '[:upper:]' '[:lower:]' <<<"$VARIABLE")
ටිනෝ

3
In ටිනෝ මෙහි නූල් පැරණි බාෂ් අනුවාද වෙත ආපසු ගෙන යා නොහැක. එය v3 හි හඳුන්වා දුන් බව මම විශ්වාස කරමි.
ත්‍රිත්ව

1
ripripleee ඔබ හරි, එය හඳුන්වා දුන්නේ bash-2.05b - කෙසේ වෙතත් එය මගේ පද්ධති වලින් සොයාගත හැකි පැරණිතම බැෂ් එකයි
Tino

11

බිල්ඩින් පමණක් භාවිතා කරමින් සම්මත කවචයක් සඳහා (බාෂිස්ම් නොමැතිව):

uppers=ABCDEFGHIJKLMNOPQRSTUVWXYZ
lowers=abcdefghijklmnopqrstuvwxyz

lc(){ #usage: lc "SOME STRING" -> "some string"
    i=0
    while ([ $i -lt ${#1} ]) do
        CUR=${1:$i:1}
        case $uppers in
            *$CUR*)CUR=${uppers%$CUR*};OUTPUT="${OUTPUT}${lowers:${#CUR}:1}";;
            *)OUTPUT="${OUTPUT}$CUR";;
        esac
        i=$((i+1))
    done
    echo "${OUTPUT}"
}

සහ ඉහළ නඩුව සඳහා:

uc(){ #usage: uc "some string" -> "SOME STRING"
    i=0
    while ([ $i -lt ${#1} ]) do
        CUR=${1:$i:1}
        case $lowers in
            *$CUR*)CUR=${lowers%$CUR*};OUTPUT="${OUTPUT}${uppers:${#CUR}:1}";;
            *)OUTPUT="${OUTPUT}$CUR";;
        esac
        i=$((i+1))
    done
    echo "${OUTPUT}"
}

FreeBSD sh: $ {1: $ ...}: නරක ආදේශනය
ඩෙරෙක්සන්

2
ඇත්ත වශයෙන්ම; සමග substrings ${var:1:1}වූ Bashism වේ.
tripleee

මෙම ප්‍රවේශය තරමක් නරක කාර්ය සාධන ප්‍රමිතික ඇත. ප්‍රමිතික සඳහා මගේ පිළිතුර බලන්න.
ඩෙජේ ක්ලේටන්

9

Bash 4 හි ඔබට යතුරු ලියනය භාවිතා කළ හැකිය

උදාහරණයක්:

A="HELLO WORLD"
typeset -l A=$A


7

සාමාන්ය ලෙස

මම බෙදා ගැනීමට බලාපොරොත්තු වන විධානය සඳහා ගෞරවය ලබා ගැනීමට මම කැමැත්තෙමි, නමුත් සත්‍යය එය මාගේ ප්‍රයෝජනය සඳහා http://commandlinefu.com වෙතින් ලබාගෙන ඇත. cdඔබේ නිවසේ ෆෝල්ඩරය තුළ ඇති ඕනෑම නාමාවලියකට ඔබ ගියහොත් එය සියලු ලිපිගොනු සහ ෆෝල්ඩර කුඩා අකුරුවලට වෙනස් කරයි. කරුණාකර ප්‍රවේශමෙන් භාවිතා කරන්න. එය දීප්තිමත් විධාන රේඛා විසඳුමක් වන අතර ඔබ ඔබේ ධාවකයේ ගබඩා කර ඇති ඇල්බම රාශියකට විශේෂයෙන් ප්‍රයෝජනවත් වේ.

find . -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;

වත්මන් නාමාවලිය හෝ සම්පූර්ණ මාර්ගය දැක්වෙන සොයාගැනීමෙන් පසුව ඔබට තිත (.) වෙනුවට නාමාවලියක් නියම කළ හැකිය.

මෙම විසඳුම ප්‍රයෝජනවත් බව ඔප්පු වනු ඇතැයි මම විශ්වාස කරමි, මෙම විධානය මඟින් සිදු නොකරන එක් දෙයක් අවකාශය අවතක්සේරු කිරීම වෙනුවට ආදේශ කිරීමකි.


මෙය හොඳ පෙනුමක් තිබුණත්, කිසිම හේතුවක් නිසා මෙය මට වැඩ කළේ නැත. මම මෙය විකල්පයක් ලෙස වැඩ කිරීමට ලබා ගත්තෙමි: සොයා ගන්න. -exec / bin / bash -c 'mv {tr `tr [AZ] [az] <<< {}`' \;
ජෝන් රික්ස්

මේ සඳහා අවශ්‍ය prenameවන්නේ perl: dpkg -S "$(readlink -e /usr/bin/rename)"ලබා දෙයිperl: /usr/bin/prename
ටිනෝ

4

බාහිර වැඩසටහන් භාවිතා කරමින් බොහෝ පිළිතුරු, එය ඇත්ත වශයෙන්ම භාවිතා නොකරයි Bash.

ඔබට Bash4 ලබා ගත හැකි බව ඔබ දන්නේ නම්, ඔබ සැබවින්ම ${VAR,,}අංකනය භාවිතා කළ යුතුය (එය පහසු සහ සිසිල් ය). 4 ට පෙර Bash සඳහා (උදාහරණයක් ලෙස මගේ මැක් තවමත් Bash 3.2 භාවිතා කරයි). වඩා අතේ ගෙන යා හැකි අනුවාදයක් නිර්මාණය කිරීම සඳහා මම නිවැරදි කරන ලද @ ghostdog74 පිළිතුර භාවිතා කළෙමි.

ඔබට ඇමතුමක් lowercase 'my STRING'ලබා දී කුඩා අකුරු ලබා ගත හැකිය . ප්‍රති result ලය var ට සැකසීම ගැන මම අදහස් කියෙව්වා, නමුත් එය ඇත්ත වශයෙන්ම අතේ ගෙන යා නොහැකි Bashනිසා අපට නූල් ආපසු ලබා දිය නොහැක. එය මුද්‍රණය කිරීම හොඳම විසඳුමයි. වැනි දෙයක් සමඟ අල්ලා ගැනීම පහසුය var="$(lowercase $str)".

මෙය ක්‍රියාත්මක වන ආකාරය

මෙය ක්‍රියාත්මක වන ආකාරය වන්නේ එක් එක් වර්‍ගයේ ASCII නිඛිල නිරූපණය ලබාගෙන printfපසුව adding 32නම් upper-to->lowerහෝ subtracting 32තිබේ නම් lower-to->upper. printfඅංකය නැවත වර්‍ගයක් බවට පරිවර්තනය කිරීමට නැවත භාවිතා කරන්න . සිට 'A' -to-> 'a'අප chars 32 ක වෙනසක් තියෙනවා.

printfපැහැදිලි කිරීමට භාවිතා කිරීම:

$ printf "%d\n" "'a"
97
$ printf "%d\n" "'A"
65

97 - 65 = 32

උදාහරණ සමඟ වැඩ කරන අනුවාදය මෙයයි.
කේතයේ ඇති අදහස් සටහන් කරන්න, ඔවුන් බොහෝ දේ පැහැදිලි කරන බැවින්:

#!/bin/bash

# lowerupper.sh

# Prints the lowercase version of a char
lowercaseChar(){
    case "$1" in
        [A-Z])
            n=$(printf "%d" "'$1")
            n=$((n+32))
            printf \\$(printf "%o" "$n")
            ;;
        *)
            printf "%s" "$1"
            ;;
    esac
}

# Prints the lowercase version of a sequence of strings
lowercase() {
    word="$@"
    for((i=0;i<${#word};i++)); do
        ch="${word:$i:1}"
        lowercaseChar "$ch"
    done
}

# Prints the uppercase version of a char
uppercaseChar(){
    case "$1" in
        [a-z])
            n=$(printf "%d" "'$1")
            n=$((n-32))
            printf \\$(printf "%o" "$n")
            ;;
        *)
            printf "%s" "$1"
            ;;
    esac
}

# Prints the uppercase version of a sequence of strings
uppercase() {
    word="$@"
    for((i=0;i<${#word};i++)); do
        ch="${word:$i:1}"
        uppercaseChar "$ch"
    done
}

# The functions will not add a new line, so use echo or
# append it if you want a new line after printing

# Printing stuff directly
lowercase "I AM the Walrus!"$'\n'
uppercase "I AM the Walrus!"$'\n'

echo "----------"

# Printing a var
str="A StRing WITH mixed sTUFF!"
lowercase "$str"$'\n'
uppercase "$str"$'\n'

echo "----------"

# Not quoting the var should also work, 
# since we use "$@" inside the functions
lowercase $str$'\n'
uppercase $str$'\n'

echo "----------"

# Assigning to a var
myLowerVar="$(lowercase $str)"
myUpperVar="$(uppercase $str)"
echo "myLowerVar: $myLowerVar"
echo "myUpperVar: $myUpperVar"

echo "----------"

# You can even do stuff like
if [[ 'option 2' = "$(lowercase 'OPTION 2')" ]]; then
    echo "Fine! All the same!"
else
    echo "Ops! Not the same!"
fi

exit 0

මෙය ක්‍රියාත්මක කිරීමෙන් පසු ප්‍රති results ල:

$ ./lowerupper.sh 
i am the walrus!
I AM THE WALRUS!
----------
a string with mixed stuff!
A STRING WITH MIXED STUFF!
----------
a string with mixed stuff!
A STRING WITH MIXED STUFF!
----------
myLowerVar: a string with mixed stuff!
myUpperVar: A STRING WITH MIXED STUFF!
----------
Fine! All the same!

මෙය ක්‍රියාත්මක විය යුත්තේ ASCII අක්ෂර සඳහා පමණි .

මට නම් එය හොඳයි, මම දන්නා නිසා මම ඒ වෙත යොමු කරන්නේ ASCII අක්ෂර පමණි.
මම මෙය භාවිතා කරන්නේ සමහර සිද්ධි-සංවේදී නොවන CLI විකල්ප සඳහා ය.


4

පරිවර්තන නඩුව සිදු කරනු ලබන්නේ හෝඩිය සඳහා පමණි. එබැවින් මෙය පිළිවෙලට ක්‍රියාත්මක විය යුතුය.

මම අවධානය යොමු කරන්නේ අක්ෂර අතර අක්ෂර අක්ෂර ඉහළ අකුරේ සිට කුඩා අකුරට පරිවර්තනය කිරීම සඳහා ය. වෙනත් ඕනෑම අක්ෂරයක් stdout හි මුද්‍රණය කළ යුතුය.

Az පරාසය තුළ ඇති සියලුම පා / යන් / ගොනුව / ගොනු නාමය AZ බවට පරිවර්තනය කරයි

කුඩා අකුර ඉහළ අකුරට පරිවර්තනය කිරීම සඳහා

cat path/to/file/filename | tr 'a-z' 'A-Z'

ඉහළ අකුරේ සිට කුඩා අකුරට පරිවර්තනය කිරීම සඳහා

cat path/to/file/filename | tr 'A-Z' 'a-z'

උදාහරණයක් වශයෙන්,

ගොනුවේ නම:

my name is xyz

බවට පරිවර්තනය වේ:

MY NAME IS XYZ

උදාහරණ 2:

echo "my name is 123 karthik" | tr 'a-z' 'A-Z'
# Output:
# MY NAME IS 123 KARTHIK

උදාහරණ 3:

echo "my name is 123 &&^&& #@$#@%%& kAR2~thik" | tr 'a-z' 'A-Z'
# Output:
# MY NAME IS 123 &&^&& #@0@%%& KAR2~THIK

3

V4 භාවිතා කරන්නේ නම්, මේ වන පුලුස්සන ලද-දී . එසේ නොවේ නම්, මෙන්න සරල, පුළුල් ලෙස අදාළ වන විසඳුමකි. මෙම ත්‍රෙඩ් එකේ ඇති වෙනත් පිළිතුරු (සහ අදහස්) පහත කේතය නිර්මාණය කිරීමට බෙහෙවින් උපකාරී විය.

# Like echo, but converts to lowercase
echolcase () {
    tr [:upper:] [:lower:] <<< "${*}"
}

# Takes one arg by reference (var name) and makes it lowercase
lcase () { 
    eval "${1}"=\'$(echo ${!1//\'/"'\''"} | tr [:upper:] [:lower:] )\'
}

සටහන්:

  • කිරීම: a="Hi All"පසුව: පහත lcase aපරිදි දේ කරනු ඇත:a=$( echolcase "Hi All" )
  • ලේස් ශ්‍රිතයේ දී, ${!1//\'/"'\''"}ඒ වෙනුවට භාවිතා කිරීමෙන් ${!1}නූල් උපුටා දැක්වීම් ඇති විට පවා මෙය ක්‍රියාත්මක වේ.

3

4.0 ට පෙර Bash අනුවාද සඳහා, මෙම අනුවාදය වේගවත් විය යුතුය (එය කිසිදු විධානයක් දෙබලක / ක්‍රියාත්මක නොකරන බැවින් ):

function string.monolithic.tolower
{
   local __word=$1
   local __len=${#__word}
   local __char
   local __octal
   local __decimal
   local __result

   for (( i=0; i<__len; i++ ))
   do
      __char=${__word:$i:1}
      case "$__char" in
         [A-Z] )
            printf -v __decimal '%d' "'$__char"
            printf -v __octal '%03o' $(( $__decimal ^ 0x20 ))
            printf -v __char \\$__octal
            ;;
      esac
      __result+="$__char"
   done
   REPLY="$__result"
}

ටෙක්නෝසෝරස්ගේ පිළිතුරට ද විභවයක් ඇත, එය මට නිසි ලෙස ක්‍රියාත්මක වුවද.


නරක නැහැ! මෙම ප්‍රවේශයේ ක්‍රියාකාරිත්වය විශ්ලේෂණය කිරීම සඳහා කරුණාකර ප්‍රමිතික සඳහා මගේ පිළිතුර බලන්න.
ඩෙජේ ක්ලේටන්

3

මෙම ප්‍රශ්නය කොතරම් පැරණි වුවත්, ටෙක්නෝසෝරස්ගේ මෙම පිළිතුරට සමාන ය . බොහෝ වේදිකා හරහා (මම භාවිතා කරන) මෙන්ම පැරණි අනුවාදයන් හරහා ගෙන යා හැකි විසඳුමක් සොයා ගැනීමට මට අපහසු විය. සුළු විචල්‍යයන් ලබා ගැනීම සඳහා අරා, කාර්යයන් සහ මුද්‍රණ, දෝංකාරය සහ තාවකාලික ලිපිගොනු භාවිතා කිරීම පිළිබඳව ද මම කලකිරීමට පත්ව සිටිමි. මෙය මට ඉතා හොඳින් ක්‍රියාත්මක වන අතර මෙතෙක් මා සිතුවේ මම බෙදා ගනීවි කියාය. මගේ ප්‍රධාන පරීක්ෂණ පරිසරයන්:

  1. GNU bash, 4.1.2 (1) අනුවාදය - මුදා හැරීම (x86_64-redhat-linux-gnu)
  2. GNU bash, 3.2.57 (1) අනුවාදය - මුදා හැරීම (sparc-sun-solaris2.10)
lcs="abcdefghijklmnopqrstuvwxyz"
ucs="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
input="Change Me To All Capitals"
for (( i=0; i<"${#input}"; i++ )) ; do :
    for (( j=0; j<"${#lcs}"; j++ )) ; do :
        if [[ "${input:$i:1}" == "${lcs:$j:1}" ]] ; then
            input="${input/${input:$i:1}/${ucs:$j:1}}" 
        fi
    done
done

නූල් හරහා නැවත ගමන් කිරීම සඳහා ලූප සඳහා සරල සී-විලාසිතාව . පහත පේළිය සඳහා ඔබ මීට පෙර මෙවැනි දෙයක් දැක නොමැති නම් මම මෙය ඉගෙන ගත් ස්ථානයයි . මෙම අවස්ථාවෙහිදී පේළිය {{ආදානය: $ i: 1} (කුඩා අකුර) ආදානයේ තිබේදැයි පරික්ෂා කරයි. නැවත ආදානයට.

input="${input/${input:$i:1}/${ucs:$j:1}}"

මෙය කිසිසේත්ම අකාර්යක්ෂමයි, ඉහත උදාහරණයේ 650 වාරයක් ලූප සහ මගේ යන්ත්‍රයේ ආයාචනා 1000 ක් ක්‍රියාත්මක කිරීමට තත්පර 35 ක් ගතවේ. ආයාචනා 1000 ක් ක්‍රියාත්මක කිරීමට තත්පර 5 කට වඩා අඩු කාලයක් ගතවන විකල්පයක් සඳහා, මගේ විකල්ප පිළිතුර බලන්න.
ඩෙජේ ක්ලේටන්

1
ස්තූතියි, එය බැලීමෙන් පමණක් එය පැහැදිලි විය යුතුය. සමහර විට පිටු දෝෂ ආදාන ප්‍රමාණයෙන් සහ ඔබ ක්‍රියාත්මක කරන පුනරාවර්තන ගණන විය හැකිය. එසේ වුවද මම ඔබේ විසඳුමට කැමතියි.
JaredTS486

3

මෙය ජරෙඩ් ටීඑස් 486 හි ප්‍රවේශයේ වඩා වේගවත් විචලනයකි, එය ඔහුගේ ප්‍රවේශය ප්‍රශස්ත කිරීම සඳහා ස්වදේශීය බාෂ් හැකියාවන් (බෑෂ් අනුවාද <4.0 ද ඇතුළුව) භාවිතා කරයි.

කුඩා අකුරු (අකුරු 25) සහ විශාල නූලක් (අක්ෂර 445) සඳහා කුඩා හා ලොකු අකුරු පරිවර්තනය සඳහා මම මෙම ප්‍රවේශයේ පුනරාවර්තන 1,000 ක් කාලය ගත කර ඇත්තෙමි. පරීක්ෂණ නූල් ප්‍රධාන වශයෙන් කුඩා අකුරු බැවින් කුඩා අකුරුවලට පරිවර්තනය සාමාන්‍යයෙන් ලොකු අකුරට වඩා වේගවත් වේ.

මම මගේ ප්‍රවේශය මෙම පිටුවේ ඇති තවත් පිළිතුරු කිහිපයක් සමඟ සංසන්දනය කර ඇති අතර එය Bash 3.2 සමඟ අනුකූල වේ. මගේ ප්‍රවේශය මෙහි ලේඛනගත කර ඇති බොහෝ ප්‍රවේශයන්ට වඩා බෙහෙවින් ක්‍රියාකාරී වන අතර එය trඅවස්ථා කිහිපයකට වඩා වේගවත් ය .

අක්ෂර 25 ක පුනරාවර්තන 1,000 ක් සඳහා කාල ප්‍රති results ල මෙන්න:

අක්ෂර 445 ක පුනරාවර්තන 1,000 ක් සඳහා කාල ප්‍රති results ල (විටර් බිනර් විසින් රචිත "ද රොබින්" කාව්‍යයෙන් සමන්විත වේ):

විසඳුමක්:

#!/bin/bash
set -e
set -u

declare LCS="abcdefghijklmnopqrstuvwxyz"
declare UCS="ABCDEFGHIJKLMNOPQRSTUVWXYZ"

function lcase()
{
  local TARGET="${1-}"
  local UCHAR=''
  local UOFFSET=''

  while [[ "${TARGET}" =~ ([A-Z]) ]]
  do
    UCHAR="${BASH_REMATCH[1]}"
    UOFFSET="${UCS%%${UCHAR}*}"
    TARGET="${TARGET//${UCHAR}/${LCS:${#UOFFSET}:1}}"
  done

  echo -n "${TARGET}"
}

function ucase()
{
  local TARGET="${1-}"
  local LCHAR=''
  local LOFFSET=''

  while [[ "${TARGET}" =~ ([a-z]) ]]
  do
    LCHAR="${BASH_REMATCH[1]}"
    LOFFSET="${LCS%%${LCHAR}*}"
    TARGET="${TARGET//${LCHAR}/${UCS:${#LOFFSET}:1}}"
  done

  echo -n "${TARGET}"
}

ප්‍රවේශය සරලයි: ආදාන නූලෙහි ඉතිරිව ඇති ලොකු අකුරු ඇති අතර, ඊළඟ එක සොයාගෙන, එම අකුරේ ඇති සියලුම අවස්ථා එහි කුඩා අකුරු ප්‍රභේදය සමඟ ප්‍රතිස්ථාපනය කරන්න. සියලුම ලොකු අකුරු ප්‍රතිස්ථාපනය වන තුරු නැවත නැවත කරන්න.

මගේ විසඳුමේ සමහර කාර්ය සාධන ලක්ෂණ:

  1. නව ක්‍රියාවලියක් තුළ බාහිර ද්විමය උපයෝගීතා යෙදවීම වළක්වන ෂෙල් බිල්ඩින් උපයෝගිතා පමණක් භාවිතා කරයි
  2. කාර්ය සාධන ද .ුවම් විඳින උප ෂෙල් වෙඩි වළක්වයි
  3. විචල්යයන් තුළ ගෝලීය නූල් ප්රතිස්ථාපනය, විචල්ය උපසර්ගය කැපීම, සහ රීජෙක්ස් සෙවීම සහ ගැලපීම වැනි කාර්ය සාධනය සඳහා සම්පාදනය කර ඇති ප්රශස්තකරණය කරන ලද ෂෙල් යාන්ත්රණ භාවිතා කරයි. මෙම යාන්ත්‍රණයන් නූල් හරහා අතින් සිදුකිරීමට වඩා වේගවත් ය
  4. අද්විතීය ගැලපෙන අක්ෂර ගණන පරිවර්තනය කිරීමට අවශ්‍ය වාර ගණන පමණක් ලූප. නිදසුනක් ලෙස, ලොකු අකුරු තුනක් ඇති කුඩා අකුරු කුඩා අකුරක් බවට පරිවර්තනය කිරීම සඳහා අවශ්‍ය වන්නේ ලූප් පුනරාවර්තන 3 ක් පමණි. පෙර සැකසූ ASCII හෝඩිය සඳහා, උපරිම ලූප පුනරාවර්තන ගණන 26 කි
  5. UCSසහ LCSඅමතර අක්ෂර සමඟ වැඩි කළ හැකිය

2

පරිවර්තනය කරන ලද නූල විචල්යයක් ලෙස ගබඩා කිරීම. පහත දැක්වෙන්නේ මා වෙනුවෙන් වැඩ $SOURCE_NAMEකිරීමයි$TARGET_NAME

TARGET_NAME="`echo $SOURCE_NAME | tr '[:upper:]' '[:lower:]'`"

1

සරල ක්‍රමය

echo "Hi all" | awk '{ print tolower($0); }'

UTF8- කේතනය කරන ලද අක්ෂර (සහ විවිධ භාෂා අක්ෂර) නිසි ලෙස හසුරුවන gawk භාවිතා කිරීම වඩා හොඳය. "Awk tolower" "ЛШТШФУМ like" වැනි දෙයක් මත අසමත් වේ.
Vit
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.