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

それを と の 2 つの変数に分けたいと思い$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}')

これは末尾のスペースを削除する必要があり、複雑に見えます。

それを行うより良い方法はありますか?

4

4 に答える 4

15

フィールド間の区切り文字はスペースのようです。したがって、cutそれらを分割するために使用できます。

file=$(echo "${MY_ARR[1]}" | cut -d' ' -f1)
parameter=$(echo "${MY_ARR[1]}" | cut -d' ' -f2-)
  • -f1最初のパラメータを意味します。
  • -f2-2番目のパラメーターからのすべてを意味します。
于 2013-01-31T15:25:05.800 に答える
5

あなたが使用することができますread

$ read file parameter <<< ${MY_ARR[1]}
$ echo "$file"
./path/path2/name.exe
$ echo "$parameter"
'word1 word2' 'name3,name4,name5'
于 2013-01-31T15:26:32.880 に答える
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

出力:

    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[ [*]} は配列 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'
于 2013-09-17T14:55:45.693 に答える
1

何かが欠けていない限り、最も簡単で最も移植性の高い方法は、これに 2 つのバリエーションの拡張を使用することです。

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

説明

  • "${MY_ARR[0]%%' '*}"- これにより、最初のスペースとその後のスペースがすべて削除され、残りの部分が返されます
  • "${MY_ARR[0]#*' '}"- これにより、最初のスペースまですべてが削除され、残りの部分が返されます

詳細な説明についてParameter Expansionは、bash man ページのセクションを参照してください。

于 2014-01-31T11:21:46.570 に答える