বাশে একটি স্ট্রিংয়ে কোনও শব্দের সূচকটি কীভাবে খুঁজে পাবেন?


10

বাশ স্ক্রিপ্টে,

আমার একটি স্ট্রিং রয়েছে যার মধ্যে একাধিক শব্দ এক বা একাধিক স্পেস দ্বারা পৃথক। অর্থাৎ,

Name   Age Sex  ID         Address

আমি যদি শব্দটির কোনও সন্ধান করতে চাই, উদাহরণস্বরূপ আমি "বয়স" শব্দের সূচীটি খুঁজতে চাই, আমি কীভাবে এটি করতে পারি?

এমন কোনও আদেশ আছে যা শব্দের সূচক সংখ্যাটি প্রত্যক্ষভাবে প্রত্যক্ষ করে যা আমি চাই?

ধন্যবাদ।


সমাধান কি কঠোরভাবে মারতে হবে? না কি awk, গ্রেপ ইত্যাদি ব্যবহার করা যেতে পারে?
jftuga

উত্তর:


12

বাশ স্ট্রিংগুলিতে শব্দগুলি পৃথক করে নিজেই সম্পাদন করে - বাস্তবে, প্রায়শই না হওয়া থেকে, এড়ানো এড়ানো একটি সমস্যা এবং কারণটি উদ্ধৃত করা এত গুরুত্বপূর্ণ। আপনার ক্ষেত্রে এটি লাভ করা সহজ: আপনার স্ট্রিংটিকে উদ্ধৃতি না দিয়ে কেবল একটি অ্যারেতে রাখুন - বাশ পৃথক উপাদানগুলিকে পৃথক করতে শব্দ বিভাজন ব্যবহার করবে। আপনার স্ট্রিংটি ভেরিয়েবলে সঞ্চিত রয়েছে তা ধরে নিচ্ছি $str,

ar=($str) # no quotes!

5 টি উপাদানের একটি অ্যারে প্রদান করবে। আপনার অ্যারে সূচকটি আপনার শব্দ সূচক (বেশিরভাগ স্ক্রিপ্টিং এবং প্রোগ্রামিং ভাষার মতো 0 থেকে গণনা করা), অর্থাৎ "বয়স" ব্যবহার করে অ্যাক্সেস করা হয়েছে

${ar[1]}  # 0 => Name, 1 => Age, 2 => Sex, 3 => ID, 4 => Address

বা, যদি আপনাকে বিষয়বস্তু দ্বারা উপাদান সূচকটি সন্ধান করতে হয় তবে অ্যারের উপরে লুপ করুন, অর্থাত্‍

function el_index {
    cnt=0; for el in "${ar[@]}"; do
        [[ $el == "$1" ]] && echo $cnt && break
        ((++cnt))
    done
}
el_index "Age" # => 1

বাহ ... আমি জানতাম না যে উদ্ধৃতিগুলি না থাকলে এটি একটি অ্যারে হবে। ধন্যবাদ!
G3Y

4
$ export FOO="Name   Age Sex  ID         Address"

* বয়সকে বয়সের সাথে প্রতিস্থাপন করুন - এটি "বয়স" এর আগে যে কোনও কিছু সরিয়ে ফেলবে:

$ echo ${FOO/*Age/Age}
Age Sex ID Address

"বয়স" এর আগে কিছু পান

$ echo ${FOO/Age*/}
Name

সেই স্ট্রিংয়ের দৈর্ঘ্য পান (যা "বয়স" এর সূচক):

$ BEGIN=${FOO/Age*/}
$ echo ${#BEGIN}
7

প্রশ্নের উত্তর দেয় না, তবে বাহ! স্লিক ট্রিক এটি ছাইতে এবং এমবেডেড ভেরিয়েবলগুলির সাথেও কাজ করে: export L='debug info warn error'; export GTE='warn'; echo ${L/*${GTE}/${GTE}}'সতর্কতা ত্রুটি' প্রিন্ট করে
স্টিভ টারওয়ার

0

আপনার যদি কঠোরভাবে ব্যাশ ব্যবহার না করতে হয় তবে ব্যাশযুক্ত সিস্টেমে সাধারণত পাওয়া অন্যান্য প্রোগ্রামগুলি ব্যবহার করতে পারেন তবে আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:

echo "Name   Age Sex ID  Addr" | python -c 'print(raw_input().index("Age"))+1'

পাইথন এটির শূন্যের সূচকটি শুরু করে, সুতরাং আমি কমান্ডের শেষে +1 যুক্ত করেছি।


0

আপনি বাশের নেটিভ রেজেক্স ব্যবহার করতে পারেন

# a function to print the index of a field and its name
printIx() { 
  for ((l=0,i=1;i<$1;i++)) ;do 
     ((l+=${#BASH_REMATCH[i]}))
  done
  printf '%3s %s\n' $l "$2"
}

#   Using a zero based index
#   "0----+----1----+----2----+----3----+----4"
str="  Name   Age Sex  ID         Address   "

if [[ $str =~ ^(\ *)(Name)(\ +)(Age)(\ +)(Sex)(\ +()ID)(\ +)(Address)\ *$ ]] ;then
  F=(Name Age Sex ID Address)
  f=(   2   4   6  8      10)  # regex back-references
  for ((g=0;g<${#f[@]};g++)) ;do
     printIx  ${f[g]} "${F[g]}"
  done 
fi

আউটপুট

  2 Name
  9 Age
 13 Sex
 20 ID
 29 Address

0

দ্রষ্টব্য : এখানে ধরে নিচ্ছেন যে সূচী দ্বারা আপনি বোঝাতে চেয়েছেন যে এটি কোন শব্দটি (0 থেকে শুরু) জানতে চান, স্ট্রিংয়ের কোন অক্ষরটি শব্দটি শুরু হয় না। অন্যান্য উত্তরগুলি উত্তরকে সম্বোধন করে।

এটি সম্পর্কে আমি অবগত নই, তবে আপনি এটি তৈরি করতে পারেন। দুটি কৌশল:

  1. এর সহজাত ক্ষমতার ব্যবহার করুন জন্য হোয়াইটস্পেস দ্বারা একটি unquoted ইনপুট আপ বিভক্ত কনস্ট্রাক্ট।
  2. আপনি যে কলামটি চান তা খুঁজে পাচ্ছেন না এমন কেসটি পরিচালনা করুন। এক্ষেত্রে আমি ফাউন্ডড ইনডেক্সকে স্টাউটে প্রেরণ করতে পছন্দ করেছি এবং স্থিতি কোডটি সন্ধানটি সফল হয়েছে কিনা তা নির্দেশ করতে দেয়। অন্যান্য সম্ভাবনা আছে।

কোড:

#!/bin/bash
find_index() {
    local str=$1
    local search=$2
    let local n=0
    local retval=1 # here, 1 is failure, 0 success
    for col in $str; do # $str unquoted -> whitespace tokenization!
    if [ $col = $search ]; then
        echo $n
        retval=0
        break
    else
        ((n++))
    fi
    done
    return $retval
}

test="Name   Age Sex  ID         Address"
idx=`find_index "$test" Age`
if [ $? -ne 0 ]; then
    echo "Not found!"
else
    echo "Found: $idx"
fi

0

শেলটিতে নিম্নলিখিত জাভাস্ক্রিপ্ট অনিলিনের চেষ্টা করুন (জাভাস্ক্রিপ্ট শেল ব্যবহার করুন):

$ js <<< "x = 'Name   Age Sex  ID         Address'; print(x.indexOf('Age'));"
7

বা একটি এখানে-ডক সহ:

js <<EOF
x = 'Name   Age Sex  ID         Address';
print(x.indexOf('Age'));
EOF

0

আমি একটি সমাধান পেয়েছি যা ভাল কাজ করে।

$ স্ট্রিং = 'এখন সময়'
$ BUF = $ {স্ট্রিং # *}
$ প্রতিধ্বনি $ BUF
সময়: আউটপুট
- $ সূচক = $ ($ {# BUF} + 1 টি) ($ {# স্ট্রিং})
$ প্রতিধ্বনি $ সূচক
আউটপুট: 8 -> প্রথম শব্দের সূচক ""

এটি জাভাতে ফাংশন ইন্ডেক্সঅফ () এর মতোই কাজ করে যা কোনও ইনপুট স্ট্রিংয়ের প্রথম উপস্থিতি ফিরে আসে।

এই সমাধানটি এখানে পেয়েছেন http://www.linuxquestions.org/questions/linux-newbie-8/bash-string-manipulation-help-670627/ (শেষ পোস্ট)। এই লোকটি আমার দিনটি বাঁচিয়েছিল। তাকে কৃতিত্ব

আপনি যদি প্রথম সূচি থেকে সাবস্ট্রিং করতে চান তবে দ্রুততর উপায়।

$ a = "কিছু দীর্ঘ স্ট্রিং"
$ বি = "রি"
$ প্রতিধ্বনি $ / আ / * $ বি / $ বি}
রিং
$ ইকো $ $ এ / $ বি * / $ বি}
কিছু দীর্ঘ স্ট্র

/programming/10349102/shell-script-substring-from-first-indexof-substring


0

যদি কোরিউটিলগুলি উপলভ্য থাকে তবে আপনি নিম্নলিখিত পদ্ধতিতে এটি করতে পারেন:

প্রতিধ্বনি $ {স্ট্রিং / বয়স //} | কাট-ডি / -ফ 1 | wc -w

প্রতি মারিয়াসমাতুটিয়ী অনুরোধ আমি কীভাবে এই 3 টি পদক্ষেপের কাজ করে তা একটি ব্যাখ্যা যুক্ত করছি:

প্রতিধ্বনি {{ স্ট্রিং / বয়স //} 1. স্ট্রিং প্রতিস্থাপন করুন যা অনন্য চরের জন্য অনুসন্ধান করা হচ্ছে (আমার ক্ষেত্রে /)

কাটা-ডি / -ফ 1 2. স্ট্রিংয়ের পুরো অংশটি কেটে ফেলুন যা অনন্য চরের পরে

wc -w 3. গণনা এবং মুদ্রণের শব্দের যা এটি বাকী রয়েছে তা আমাদের একটি সূচক নম্বর দেবে

রেফারেন্সের জন্য দয়া করে চেক করুন:

http://www.tldp.org/LDP/abs/html/parameter-substedia.html (এখানে যান: "পরিবর্তনশীল সম্প্রসারণ / সাবস্ট্রিং প্রতিস্থাপন")
http://www.gnu.org/software/coreutils/manual/coreutils .html (এখানে যান: "কাট কমান্ড" এবং "ডাব্লুসি ডাইরেকশন"


এটি হাতের মুঠোয় সমস্যার সমাধান করার সময়, এই জাতীয় সংক্ষিপ্ত জবাবগুলি এই সাইটে প্রত্যাখ্যান করা হয়। এটি কেন কাজ করে তা ব্যাখ্যা করে কয়েকটি শব্দ ব্যয় করা আরও সহায়ক হবে। অনুগ্রহপূর্বক তা - ই করো.
মারিউস ম্যাটুটিয়ায়

0

পূর্বে প্রদত্ত দুটি উত্তরের মিশ্রণ, খাঁটি বাশ অ্যারে এবং সাবস্ট্রিং প্রতিস্থাপন ব্যবহার করে।

ধারণাটি হ'ল আপনি যা চান তার আগে সমস্ত শব্দের একটি স্ট্রিং পান, তারপরে সেই স্ট্রিংয়ের শব্দের সংখ্যাটিকে একটি অ্যারে বানিয়ে তা গণনা করুন।

$ haystack="Name   Age Sex  ID         Address"
$ words_before=( ${haystack%Age*} )     # truncate string, make array
$ echo ${#words_before[*]}              # count words in array
1

অবশ্যই বয়স অন্য ভেরিয়েবলে সংরক্ষণ করা যেতে পারে needle, তারপরে ব্যবহার করুন ${haystack%$needle*}। আপনার সন্ধান করা শব্দটি যদি অন্য একটি শব্দের উপসেট হয় তবে কোপিশচের উত্তর এখনও কাজ করে থাকলে সমস্যাগুলির প্রত্যাশা করুন।


0

এটি একটি 7-বছরের পুরানো প্রশ্ন, তবে কারও কারও কাছে খাঁটি বাশের উত্তরের প্রয়োজন হতে পারে।

STRING="Name   Age Sex  ID         Address"
INDEXOF_AGE=${#${STRING/Age*/}}
echo $INDEXOF_AGE
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.