2013-01-31 56 views
8

मैं सरणी में निम्न डेटा है:बैश विभाजित स्ट्रिंग

MY_ARR[0]="./path/path2/name.exe 'word1 word2' 'name1,name2'" 
MY_ARR[1]="./path/path2/name.exe 'word1 word2' 'name3,name4,name5'" 
MY_ARR[2]=".name.exe 'word1 word2'" 
MY_ARR[3]="name.exe" 
MY_ARR[4]="./path/path2/name.exe 'word1 word2' 'name1'" 
MY_ARR[5]="./path/path2/name.exe 'word1 word2' 'name.exe, name4.exe, name5.exe'" 

मैं इसे दो चर में विभाजित करना चाहते हैं: $file और $parameter

उदाहरण:

file="./path/path2/name.exe" 
parameter="'word1 word2' 'name1,name2'" 

मैं awk साथ यह कर सकते हैं:

parameter=$(echo "${MY_ARR[1]}" | awk -F\' '{print $2 $4}') 
file=$(echo "${MY_ARR[1]}" | awk -F\' '{print $1}') 

इस रिक्ति को दूर करने की जरूरत है और जटिल करने के लिए लग रहा है।

क्या ऐसा करने का कोई बेहतर तरीका है?

उत्तर

15

ऐसा लगता है कि फ़ील्ड के बीच विभाजक एक स्थान है। इसलिए, आप उन्हें विभाजित करने के लिए cut उपयोग कर सकते हैं:

file=$(echo "${MY_ARR[1]}" | cut -d' ' -f1) 
parameter=$(echo "${MY_ARR[1]}" | cut -d' ' -f2-) 
  • -f1 पहले पैरामीटर का मतलब है।
  • -f2- का मतलब दूसरे पैरामीटर से सबकुछ है।
+0

हाँ, मुझे कटौती के बारे में पता हैअनुभाग। मैंने इसे अपनी पहली कोशिश के साथ इस्तेमाल किया। मैंने इसका इस्तेमाल करने से इंकार कर दिया क्योंकि मुझे रिक्त स्थान होने पर तीसरे और मुंह से चूकने से डर था ... जांचने की ज़रूरत है! – idobr

5

आप उपयोग कर सकते हैं read:

$ read file parameter <<< ${MY_ARR[1]} 
$ echo "$file" 
./path/path2/name.exe 
$ echo "$parameter" 
'word1 word2' 'name3,name4,name5' 
+3

यह बेहतर समाधान है, क्योंकि इसे कार्य को पूरा करने के लिए कई नई प्रक्रियाओं की आवश्यकता नहीं होती है (एक कमांड प्रतिस्थापन के लिए, दो पाइपलाइन के दोनों तरफ के लिए)। – chepner

2

को देखते हुए इस सरणी:

MY_ARR[0]="./path/path2/name.exe 'word1 word2' 'name1,name2'" 
    MY_ARR[1]="./path/path2/name.exe 'word1 word2' 'name3,name4,name5'" 
    MY_ARR[2]=".name.exe    'word1 word2'" 
    MY_ARR[3]="name.exe" 
    MY_ARR[4]="./path/path2/name.exe 'word1 word2' 'name1'" 
    MY_ARR[5]="./path/path2/name.exe 'word1 word2' 'name.exe, name4.exe, name5.exe'" 

चलें 2 नए सरणियों MY_FILES और MY_PARAMETERS

for MY_ARR_INDEX in ${!MY_ARR[*]} ; do 

     ###### 
     # Set the current file in new array. 

       MY_FILES[ ${MY_ARR_INDEX} ]=${MY_ARR[ ${MY_ARR_INDEX} ]// *} 

     ###### 
     # Set the current parameters in new array 

     MY_PARAMETERS[ ${MY_ARR_INDEX} ]=${MY_ARR[ ${MY_ARR_INDEX} ]#* } 

     ###### 
     # Show the user whats happening 
     # (from here until done is just printing info.) 

     printf "MY_FILES[ ${MY_ARR_INDEX} ]=\"%s\" ; MY_PARAMETERS[ ${MY_ARR_INDEX} ]=\"%s\"\n" \ 
     \ 
      "${MY_ARR[ ${MY_ARR_INDEX} ]// *}" "${MY_ARR[ ${MY_ARR_INDEX} ]#* }" 

    done 


    MY_FILES[ 0 ]="./path/path2/name.exe" ; MY_PARAMETERS[ 0 ]="'word1 word2' 'name1,name2'" 
    MY_FILES[ 1 ]="./path/path2/name.exe" ; MY_PARAMETERS[ 1 ]="'word1 word2' 'name3,name4,name5'" 
    MY_FILES[ 2 ]=".name.exe" ; MY_PARAMETERS[ 2 ]="   'word1 word2'" 
    MY_FILES[ 3 ]="name.exe" ; MY_PARAMETERS[ 3 ]="name.exe" 
    MY_FILES[ 4 ]="./path/path2/name.exe" ; MY_PARAMETERS[ 4 ]="'word1 word2' 'name1'" 
    MY_FILES[ 5 ]="./path/path2/name.exe" ; MY_PARAMETERS[ 5 ]="'word1 word2' 'name.exe, name4.exe, name5.exe'" 

प्रत्येक फ़ाइल का उपयोग कैसे करें:

for MY_ARR_INDEX in ${!MY_FILES[*]} ; do 

     CUR_FILE=${MY_FILES[ ${MY_ARR_INDEX} ] } 

     echo "# Do something with this file: ${CUR_FILE}" 

    done 

आउटपुट:

Do something with this file: ./path/path2/name.exe 
    Do something with this file: ./path/path2/name.exe 
    Do something with this file: .name.exe 
    Do something with this file: name.exe 
    Do something with this file: ./path/path2/name.exe 
    Do something with this file: ./path/path2/name.exe 

प्रत्येक पैरामीटर का उपयोग कैसे करें:

for MY_ARR_INDEX in ${!MY_PARAMETERS[*]} ; do 

     CUR_FILE=${MY_FILES[ ${MY_ARR_INDEX} ]} 

     echo "# Do something with this parameter: ${CUR_FILE}" 

    done 

आउटपुट: {! MY_FILES [[*]}

Do something with this parameter: ./path/path2/name.exe 
    Do something with this parameter: ./path/path2/name.exe 
    Do something with this parameter: .name.exe 
    Do something with this parameter: name.exe 
    Do something with this parameter: ./path/path2/name.exe 
    Do something with this parameter: ./path/path2/name.exe 

के बाद से $ में परिणाम सरणी MY_FILES के अनुक्रमणिका NUMBERS आप अन्य सरणी तक पहुंचने के लिए एक ही अनुक्रमणिका संख्या का उपयोग भी कर सकते हैं। टी में उसका तरीका, आप उसी लूप में डेटा के कई कॉलम तक पहुंच सकते हैं। इसलिए जैसा:

################ 
    # 
    # Print each file and matching parameter(s) 
    # 
    ################ 

    # Set a printf format string so we can print all things nicely. 

    MY_PRINTF_FORMAT="# %25s %s\n" 

    ################ 
    # 
    # Print the column headings and use index numbers 
    # 
    #  to print adjacent array elements. 
    # 
    ################ 
    (

      printf "${MY_PRINTF_FORMAT}" "FILE" "PARAMETERS" "----" "----------" 

     for MY_ARR_INDEX in ${!MY_FILES[*]} ; do 

      printf "${MY_PRINTF_FORMAT}" "${MY_FILES[ ${MY_ARR_INDEX} ]}" "${MY_PARAMETERS[ ${MY_ARR_INDEX} ]}" 

     done 
    ) 

आउटपुट:

      FILE PARAMETERS 
          ---- ---------- 
      ./path/path2/name.exe 'word1 word2' 'name1,name2' 
      ./path/path2/name.exe 'word1 word2' 'name3,name4,name5' 
         .name.exe    'word1 word2' 
         name.exe name.exe 
      ./path/path2/name.exe 'word1 word2' 'name1' 
      ./path/path2/name.exe 'word1 word2' 'name.exe, name4.exe, name5.exe' 
1

जब तक मैं कुछ याद कर रहा हूँ, सरल और सबसे पोर्टेबल तरह से सिर्फ इस लिए विस्तार के दो रूपों का उपयोग करने के लिए होगा।

file="${MY_ARR[0]%%' '*}" 
parameter="${MY_ARR[0]#*' '}" 

स्पष्टीकरण

  • "${MY_ARR[0]%%' '*}" - यह यह बाद पहली अंतरिक्ष और कुछ भी निकाल देता है, और भाग
  • "${MY_ARR[0]#*' '}" शेष रिटर्न - यह पहला अंतरिक्ष करने के लिए सब कुछ निकाल देता है, और शेष रिटर्न भाग

अधिक विस्तृत स्पष्टीकरण के लिए, 012 देखें बैश मैन पेज