string - কসম - স্ট্রিং থিওরি হিমাংশু কর




কিভাবে একটি স্ট্রিং রূপান্তর নিম্ন স্তরে বাশ? (13)

একটি নিম্ন স্ট্রিং মধ্যে একটি স্ট্রিং রূপান্তর করতে bash একটি উপায় আছে?

উদাহরণস্বরূপ, যদি আমার থাকে:

a="Hi all"

আমি এটা রূপান্তর করতে চাই:

"hi all"

নিয়মিত অভিব্যক্তি

আমি যে কমান্ডটি শেয়ার করতে চাই তার জন্য আমি ক্রেডিট নিতে চাই তবে সত্যই আমি এটি আমার নিজের ব্যবহারের জন্য http://commandlinefu.com থেকে পেয়েছি। এটি সুবিধাজনক যে যদি আপনি নিজের হোম ফোল্ডারের মধ্যে কোনও ডিরেক্টরিতে cd করেন তবে এটি সমস্ত ফাইল এবং ফোল্ডারকে নিম্নতর ক্ষেত্রে পরিবর্তিত করবে, দয়া করে সাবধানতার সাথে ব্যবহার করুন। এটি একটি উজ্জ্বল কমান্ড লাইন ফিক্স এবং আপনার ড্রাইভে সংরক্ষণ করা অ্যালবামগুলির জনসংখ্যার জন্য বিশেষত দরকারী।

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

আপনি বর্তমান ডিরেক্টরি বা সম্পূর্ণ পাথ নির্দেশ করে যা পরে ডট (।) এর জায়গায় একটি ডিরেক্টরি নির্দিষ্ট করতে পারেন।

আমি আশা করি এই সমাধানটি এমন এক জিনিস যা প্রমাণ করে না যে এই কমান্ডটি আন্ডারস্কোরগুলির সাথে স্পেসগুলি প্রতিস্থাপন করে না - ওহ ভাল অন্য সময়।


tr :

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

AWK :

{ print tolower($0) }

sed :

y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/

Bash 4 আপনি টাইপসেট ব্যবহার করতে পারেন

উদাহরণ:

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

V4 ব্যবহার করে, এই baked-in । যদি না হয়, এখানে একটি সহজ, ব্যাপকভাবে প্রযোজ্য সমাধান। এই থ্রেডে অন্যান্য উত্তর (এবং মন্তব্য) নীচের কোড তৈরি করতে বেশ সহায়ক ছিল।

# 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} পরিবর্তে এটি স্ট্রিংয়ের উদ্ধৃতিতেও কাজ করার অনুমতি দেয়।


আমি জানি এটি একটি পুরাতন পোস্ট কিন্তু আমি এই সাইটটিকে অন্য সাইটের জন্য তৈরি করেছি তাই আমি ভাবলাম আমি এখানে পোস্ট করবো:

UPPER -> নিম্ন : পাইথন ব্যবহার করুন:

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

অথবা রুবি:

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

অথবা পার্ল (সম্ভবত আমার প্রিয়):

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

অথবা পিএইচপি:

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

অথবা Awk:

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

অথবা সাঈদ:

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

বা বাশ 4:

b=${a,,}

অথবা যদি নোডজেএসএসটি থাকে তবে (এবং কিছুটা বাদাম ...):

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');"`

অথবা পিএইচপি:

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

অথবা Awk:

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

অথবা সাঈদ:

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

বা বাশ 4:

b=${a^^}

অথবা যদি নোডজেএসএসটি থাকে তবে (এবং কিছুটা বাদাম ...):

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

আপনি dd ব্যবহার করতে পারেন (কিন্তু আমি না!):

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

এছাড়াও যখন আপনি 'শেল' বলবেন তখন আমি বুঝি আপনি zsh অর্থ কিন্তু যদি আপনি zsh ব্যবহার করতে পারেন তবে এটি সহজ

b=$a:l

নিম্ন ক্ষেত্রে এবং জন্য

b=$a:u

উচ্চ ক্ষেত্রে জন্য।


একটি পরিবর্তনশীল মধ্যে রূপান্তরিত স্ট্রিং সংরক্ষণ করুন। আমার জন্য কাজ করে - $SOURCE_NAME $TARGET_NAME

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

এটি JaredTS486 এর পদ্ধতির একটি দ্রুততর বৈচিত্র্য যা তার পদ্ধতিটি অপ্টিমাইজ করার জন্য নেটিভ বাশ ক্ষমতাগুলি (বাশ সংস্করণগুলি <4.0) সহ ব্যবহার করে।

আমি ছোট হাতের স্ট্রিং (25 অক্ষর) এবং বৃহত্তর স্ট্রিং (445 অক্ষর) এর জন্য এই পদ্ধতির 1000 টি পুনরাবৃত্তি করেছি, উভয় ছোট হাতের এবং বড় হাতের রূপান্তরগুলির জন্য। যেহেতু পরীক্ষার স্ট্রিংগুলি মূলত ছোট হাতের অক্ষর, ছোট হাতের অক্ষরে রূপান্তরগুলি সাধারণত বড় হাতের অক্ষরের তুলনায় দ্রুত।

আমি এই পদ্ধতিতে আমার পছন্দের সাথে তুলনা করেছি যা এই পৃষ্ঠার অনেকগুলি উত্তর যা ব্যাশ 3.2 এর সাথে সামঞ্জস্যপূর্ণ। আমার পদ্ধতি এখানে দস্তাবেজ সর্বাধিক পন্থা চেয়ে অনেক বেশি পারফরম্যান্ট, এবং বেশিরভাগ ক্ষেত্রে tr চেয়ে আরও দ্রুত।

এখানে 25 অক্ষরের 1,000 পুনরাবৃত্তিগুলির জন্য সময় ফলাফল রয়েছে:

  • ছোট হাতের কাছে আমার পদ্ধতির জন্য 0.46s; বড় হাতের জন্য 0.96s
  • Orwellophile এর ছোট হাতের অক্ষর জন্য 1.16s ; বড় হাতের জন্য 1.59s
  • ছোট হাতের অক্ষরের জন্য 3.67s; বড় হাতের জন্য 3.81s
  • Ghostdog74 এর লোকেশের জন্য 11.12 সেকেন্ড ; বড় হাতের জন্য 31.41s
  • 26.25 সেকেন্ডের জন্য টেকনোসারাসের পদ্ধতির জন্য; বড় হাতের জন্য 26.21s
  • 25.06s JaredTS486 এর জন্য ছোট হাতের অক্ষরে; বড় হাতের জন্য 27.04s

445 অক্ষরের 1,000 পুনরাবৃত্তির ফলাফলের ফলাফল (উইটার বাইনারের কবিতা "রবিন" সহ):

  • ছোট হাতের কাছে আমার পদ্ধতির জন্য 2s; বড় হাতের জন্য 12s
  • ছোট হাতের অক্ষর জন্য 4s; বড় হাতের জন্য 4s
  • Orwellophile এর ছোট হাতের অক্ষর জন্য 20s; বড় হাতের জন্য 29s
  • Ghostdog74 এর ছোট হাতের অক্ষরে 75 এর জন্য; বড় হাতের জন্য 669s। প্রধান লক্ষ্যগুলির সাথে একটি পরীক্ষার মধ্যে পারফরম্যান্সের পার্থক্য কতটুকু নাটকীয় তা উল্লেখ করা আকর্ষণীয়।
  • 467s টেকনোস aurাসের জন্য ছোট হাতের অক্ষর; বড় হাতের জন্য 449s
  • JaredTS486 এর ছোট হাতের অক্ষরের জন্য 660s ; বড় হাতের জন্য 660s। এটা মনে রাখা খুবই আকর্ষণীয় যে এই পদ্ধতিটি ব্যাশে ক্রমাগত পৃষ্ঠা ফল্ট (মেমরি সোয়াপিং) তৈরি করেছে

সমাধান:

#!/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. শেল মেকানিজমগুলি ব্যবহার করে যা কর্মক্ষমতার জন্য কম্পাইল এবং অপ্টিমাইজ করা হয়, যেমন ভেরিয়েবলগুলির মধ্যে গ্লোবাল স্ট্রিং প্রতিস্থাপন, পরিবর্তনশীল প্রতিক্রিয়া trimming, এবং regex অনুসন্ধান এবং মিলিং। এই প্রক্রিয়াগুলি স্ট্রিংগুলির মাধ্যমে নিজে পুনরাবৃত্তি করার চেয়ে অনেক দ্রুত
  4. লুপগুলি শুধুমাত্র রূপান্তরিত হওয়ার জন্য অনন্য মিলযুক্ত অক্ষরের গণনা দ্বারা প্রয়োজনীয় সংখ্যা। উদাহরণস্বরূপ, একটি স্ট্রিং রূপান্তর করা হয়েছে যার তিনটি বড় বড় হাতের অক্ষর ছোট হাতের অক্ষরে রয়েছে কেবল 3 লুপ পুনরাবৃত্তি প্রয়োজন। পূর্বনির্ধারিত ASCII বর্ণমালার জন্য, সর্বাধিক লুপ পুনরাবৃত্তি 26
  5. UCS এবং LCS অতিরিক্ত অক্ষর দিয়ে উন্নত করা যেতে পারে

প্রাক বাশ 4.0

Bash একটি স্ট্রিং এর কেস লোয়ার এবং পরিবর্তনশীল বরাদ্দ

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

echo "$VARIABLE"

বহিরাগত প্রোগ্রাম ব্যবহার করে অনেক উত্তর, যা সত্যিই Bash ব্যবহার করে না।

যদি আপনি জানেন যে আপনার কাছে Bash4 উপলব্ধ থাকবে তবে আপনাকে অবশ্যই ${VAR,,} নোটেশন ব্যবহার করা উচিত (এটি সহজ এবং শান্ত)। 4 এর আগে বাশের জন্য (আমার ম্যাক এখনও উদাহরণস্বরূপ ব্যাশ 3.2 ব্যবহার করে)। আমি একটি আরও পোর্টেবল সংস্করণ তৈরি করতে @ ghostdog74 এর উত্তরের সংস্করণটি ব্যবহার করেছি।

এক আপনি lowercase 'my STRING' কল এবং একটি ছোট হাতের সংস্করণ পেতে পারেন। আমি ফলাফলটি var var- এ নির্ধারণ সম্পর্কে মন্তব্য পড়েছি, কিন্তু এটি সত্যিই Bash পোর্টেবল নয়, কারণ আমরা স্ট্রিংগুলি ফেরত দিতে পারছি না। মুদ্রণ এটি সর্বোত্তম সমাধান। var="$(lowercase $str)" মত ক্যাপচার করা সহজ।

কিভাবে এই কাজ করে

এই কাজটি উপায়টি হল printf দিয়ে প্রতিটি গৃহস্থালি ASCII পূর্ণসংখ্যা উপস্থাপনা এবং তারপরে adding 32 upper-to->lower , বা subtracting 32 lower-to->upper subtracting 32 । তারপর একটি গৃহস্থালি ফিরে নম্বর রূপান্তর আবার printf ব্যবহার করুন। 'A' -to-> 'a' আমাদের 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="[email protected]"
    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="[email protected]"
    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 "[email protected]" 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

এবং ফলাফল চলার পরে:

$ ./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 বিকল্পগুলির জন্য এটি ব্যবহার করছি।


বিভিন্ন উপায়ে:

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

Perl

$ 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

রূপান্তর ক্ষেত্রে শুধুমাত্র বর্ণমালা জন্য সম্পন্ন করা হয়। সুতরাং, এই সুন্দরভাবে কাজ করা উচিত।

আমি upper case থেকে lower case থেকে alpha মধ্যে বর্ণমালা রূপান্তর উপর মনোযোগ নিবদ্ধ করছি। অন্য যেকোন অক্ষর স্টেডাউটে মুদ্রিত হওয়া উচিত ...

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 &&^&& #@[email protected]%%& KAR2~THIK

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






lowercase