Satırını bash-də kiçik hala çevirmək

Bir simli çevirmək üçün də bir yol varmı?

Məsələn, əgər varsa:

 a="Hi all" 

Bunu onu çevirmək istəyirəm:

 "hi all" 
810
15 февр. 15 Fevral tarixində qatil tərəfindən təyin olundu 2010-02-15 10:02 '10 at 10:02 2010-02-15 10:02
@ 17 cavab

Müxtəlif yollar var:

tr

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

Awk

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

Bash 4.0

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

Perl

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

Bəş

 lc(){ case "$1" in [AZ]) 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 
1388
15 февр. cavab ghostdog74 15 feb verilir . 2010-02-15 10:43 '10 at 10:43 2010-02-15 10:43

Bash 4-də:

Kiçikdir

 $ 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 

Böyük halda

 $ 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 

Toggle (sənədsiz, lakin mütləq kompilyasiya müddətində özelleştirilemez)

 $ 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 

Capital (sənədsiz, lakin kompilyasiya zamanı mütləq yapılandırılmayan)

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

Başlığı olan iddia:

 $ 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" 

declare atributunu aradan qaldırmaq üçün + istifadə edin. Məsələn, declare +c string . Bu, cari dəyəri deyil, sonrakı tapşırıqları təsir edir.

declare parametrləri dəyişənin xüsusiyyətini dəyişdirir, lakin məzmunu deyil. Mənim nümunələrimdəki redistributlər, dəyişiklikləri göstərmək üçün məzmunu yeniləyir.

Düzenle:

Əlavə "birinci xarakterə sözə keçin" ( ${var~} ), ghostdog74 tərəfindən təklif olunduğu kimi.

Düzenle: Bash 4.3 uyğun olaraq sabit tilde davranışı.

310
15 февр. Cavab Dennis Williamson tərəfindən 15 Fevralda verilir. 2010-02-15 13:31 '10 at 13:31 2010-02-15 13:31
 echo "Hi All" | tr "[:upper:]" "[:lower:]" 
103
15 февр. cavab 15 febdə şuvalov tərəfindən verilir . 2010-02-15 10:13 '10 at 10:13 2010-02-15 10:13

tr :

 a="$(tr [AZ] [az] <<< "$a")" 

AWK :

 { print tolower($0) } 

sed :

 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ 
65
15 февр. 15 fevralda Ignacio Vazquez-Abrams tərəfindən verilmiş cavab. 2010-02-15 10:03 '10 at 10:03 'da 2010-02-15 10:03

Bilirəm ki, bu, köhnə bir postdur, amma başqa bir sayt üçün bu cavabı verdim, buna görə də burada yerləşdirdiyimi düşündüm:

TOP → alt : istifadə python:

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

Və ya Ruby:

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

Və ya Perl (bəlkə də mənim sevimli):

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

Və ya PHP:

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

Və ya awk:

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

Və ya:

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

Və ya Bash 4:

 b=${a,,} 

Və ya NodeJS, varsa (və bəzi qoz-fındıq ...):

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

Siz də dd istifadə edə bilərsiniz (lakin mən deyiləm!):

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

aşağıda → TOP :

python istifadə edin:

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

Və ya Ruby:

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

Və ya Perl (bəlkə də mənim sevimli):

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

Və ya PHP:

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

Və ya awk:

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

Və ya:

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

Və ya Bash 4:

 b=${a^^} 

Və ya NodeJS, varsa (və bəzi qoz-fındıq ...):

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

Siz də dd istifadə edə bilərsiniz (lakin mən deyiləm!):

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

Ayrıca, kabuk deyərkən, mən bash deməkdir, amma zsh istifadə edə bilərsiniz, bu qədər asandır

 b=$a:l 

kiçik halda və

 b=$a:u 

böyük halda.

30
14 мая '14 в 12:36 2014-05-14 12:36 cavab nettux443 14 may '14 saat 12:36 2014-05-14 12:36 verilir

Zsh:

 echo $a:u 

Sevmək zsh!

22
27 янв. Jan 27-də Scott Smedley tərəfindən verilmiş cavab 2011-01-27 08:37 '11 saat 08:37 'da 2011-01-27 08:37

GNU sed istifadə edərək:

 sed 's/.*/\L> 

Məsələn:

 $ foo="Some STRIng"; $ foo=$(echo "$foo" | sed 's/.*/\L $ echo "$foo" some string 
15
26 сент. Cavab devnull 26 sep verilir . 2013-09-26 18:45 '13, saat 18:45 'da 2013-09-26 18:45

Yalnız standart funksiyanı istifadə edərək, standart bir kabuk üçün (arabası olmayan):

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

Və yuxarı halda:

 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}" } 
10
21 янв. texnosaurus tərəfindən verilmiş cavab Yanvar 21 2012-01-21 13:27 '12 at 13:27 2012-01-21 13:27

Pre Bash 4.0

Bash Bir simli halda atın və bir dəyişənə təyin edin.

 VARIABLE=$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]') echo "$VARIABLE" 
7
21 авг. Cavab hawkeye126 21 avqust verilir . 2013-08-21 19:36 '13 saat 19:36 'da 2013-08-21 19:36

Bash 4-də dəsti istifadə edə bilərsiniz

Məsələn:

 A="HELLO WORLD" typeset -l A=$A 
7
21 авг. cavab c4f4t0r 21 aug verilir . 2013-08-21 13:21 '13 'da 13:21' də 2013-08-21 13:21

Daimi ifadə

Mən bölüşmək istədiyim komanda üçün məsuliyyət almaq istərdim, amma əslində mən bunu http://comlinelinefu.com saytından özüm üçün aldım, Avantaj ki, evinizdə hər hansı bir cd varsa qovluq, bütün faylları və qovluqları recursively daha aşağı halda dəyişəcək, ehtiyatla istifadə edin. Bu parlaq komanda xəttini düzəldir və diskinizdə saxladığınız bir çox albom üçün xüsusilə faydalıdır.

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

Mövcud kataloq və ya tam yol göstərən axtarışdan sonra bir nöqtə yerinə bir kataloq təyin edə bilərsiniz.

Ümid edirəm ki, bu qərar faydalı olacaq, çünki bu əmr yoxdur, bəndləri altlıqları ilə əvəz etmək mümkündür - bəlkə də yenə.

7
24 янв. Cavab 24 yanvar Derek Shaw tərəfindən verilir 2011-01-24 16:53 '11 'da 16:53' da 2011-01-24 16:53

Bunu edə bilərsiniz

 s="Hello World!" echo $s # Hello World! a=${s,,} echo $a # hello world! b=${s^^} echo $b # HELLO WORLD! 

2019

23 марта '17 в 9:48 2017-03-23 09:48 Cavab Bikesh M Annur tərəfindən 23 Mart 'da 9:48' də veriləcək, 2017-03-23 ​​09:48

4.0 əvvəlində Bash versiyalarında, bu versiya ən sürətli olmalıdır ( fork / exec hər hansı əmrləri yerinə yetirmədiyi üçün ):

 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 [AZ] ) printf -v __decimal '%d' "'$__char" printf -v __octal '%03o' $(( $__decimal ^ 0x20 )) printf -v __char \\$__octal ;; esac __result+="$__char" done REPLY="$__result" } 

Texnosura cavabı da mənim üçün düzgün iş olsa da, potensiala malik idi.

3
24 марта '13 в 16:43 2013-03-24 16:43 cavab Orwellophile tərəfindən verilir 24 Mart '13, 16:43 2013-03-24 16:43

Bu sualın nə qədər yaşlı olmasına baxmayaraq, bu cavab teknosaurusuna bənzəyir . Çox platformalarda (mən istifadə edirəm), eləcə də bash-in köhnə versiyasını daşıyan bir həll tapmaq çətin idi. Mən də array, funksiyaları və parmak izləri, yankıları və müvəqqəti faylları istifadə edərək həddindən artıq dəyişkənlər çıxarmaq üçün həyəcanlandım. Bu mənim üçün çox yaxşıdır, mən onu paylaşacağımı düşünürdüm. Mənim əsas test mühiti:

  • GNU bash versiyası 4.1.2 (1) -release (x86_64-redhat-linux-gnu)
  • GNU bash versiyası 3.2.57 (1) -release (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 

Satırlar vasitəsilə təkrarlamaq üçün sadə C-stil loop . Aşağıdakı xətt üçün, bundan əvvəl burada belə bir şey görməmiş olsanız, bu mövzunu öyrəndim . Bu halda xətt giriş faylında $ {input: $ i: 1} (simli halda) mövcud olub-olmadığını yoxlayır və bu $ {ucs: $ j: 1} (yuxarı halda) ilə əvəz edilsin və onu geri saxlayır girişində.

 input="${input/${input:$i:1}/${ucs:$j:1}}" 
2
23 дек. Cavab JaredTS486 23 dekabrda verilir. 2015-12-23 20:37 '15 saat 20:37 'da, 2015-12-23 20:37

V4 istifadə edərkən bişirilir . Əgər yoxsa, burada sadə, geniş tətbiq olunan bir həlldir . Bu mövzuda digər cavablar (və şərhlər) aşağıdakı kodu yaratmaqda olduqca faydalı idi.

 # 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:] )\' } 

Qeydlər:

  • İcra: a="Hi All" və sonra: lcase a ilə eyni şeyi edəcəyik: a=$( echolcase "Hi All" )
  • Lcase funksiyasında ${!1//\'/"'\''"} əvəzinə ${!1//\'/"'\''"} istifadə edərək, işləməyə imkan verir, hətta string dırnaq işarələrini ehtiva edir.
2
23 марта '13 в 1:42 2013-03-23 01:42 Cavab Stephen M. Harris tərəfindən 23 Mart 2013 tarixində 1:42 2013-03-23 ​​01:42 tarixində verilir

Bir çox cavablar əslində Bash istifadə etməyən xarici proqramlardan istifadə edir.

Əgər Bash4 mövcud olduğunu bilirsinizsə, sadəcə ${VAR,,} qeydindən istifadə etməliyəm (bu asan və sadədir). 4 qədər bash üçün (məsələn, Bash 3.2 hələ də Mac üçün istifadə olunur). Daha portativ bir versiya yaratmaq üçün @ ghostdog74 cavabının düzeltilmiş versiyasını istifadə etdim.

lowercase 'my STRING' zəng edə və bir kiçik halda versiyasını əldə edə bilərsiniz. Nəticəni təyin etmək barədə şərhləri oxumuşam, amma bu Bash çox portativ deyil, çünki biz satırları geri ala bilmirik. Çap ən yaxşı həlldir. var="$(lowercase $str)" kimi bir şeylə işləmək asan.

Necə işləyir?

Necə işləyir printf ilə hər bir char ASCII tamsaylı təmsil almaq və sonra upper-to->lower əgər adding 32 və ya lower-to->upper əgər subtracting 32 . Sonra nömrəni geriyə çevirmək üçün yenidən printf istifadə edin. 'A' -to-> 'a' 32 simvol 'A' -to-> 'a' var.

printf izah etmək üçün printf istifadə edin:

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

97 - 65 = 32

Və bu, nümunələri ilə bir iş versiyasıdır.
Bir çoxu izah etdikləri kimi, koddakı şərhlərə diqqət yetirin:

 #!/bin/bash # lowerupper.sh # Prints the lowercase version of a char lowercaseChar(){ case "$1" in [AZ]) 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 [az]) 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 

Və başlamadan sonra nəticələr:

 $ ./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! 

Bu, yalnız ASCII simvolları üçün işləməlidir, lakin .

Bu mənim üçün böyükdür, çünki bilirəm ki, mən yalnız ASCII simvollarını ötürəcəyəm.
Məsələn, məsələn, bəzi halda həssas CLI parametrləri üçün istifadə edirəm.

2
16 мая '17 в 13:04 2017-05-16 13:04 Cavab 16 may 17'09 tarixində 13:04 2017-05-16 13:04 tarixində Gus Neves tərəfindən verilir

Dönüştürülmüş simli bir dəyişənə edin. $SOURCE_NAME sonra - $SOURCE_NAME - $TARGET_NAME

 TARGET_NAME="`echo $SOURCE_NAME | tr '[:upper:]' '[:lower:]'`" 
0
08 июля '16 в 12:20 2016-07-08 12:20 Cavab verilir nitinr708 08 iyul '12 saat 12:20 2016-07-08 12:20

Tags haqqında suallar və ya bir sual