Bash拆分字符串

ido*_*obr 8 string bash awk split cut

我在数组中有以下数据:

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'"
Run Code Online (Sandbox Code Playgroud)

我想把它分成两个变量:$file$parameter.

例:

file="./path/path2/name.exe"
parameter="'word1 word2' 'name1,name2'"
Run Code Online (Sandbox Code Playgroud)

我可以用awk做到这一点:

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

这需要删除尾随空格并且看起来很复杂.

有没有更好的方法呢?

fed*_*qui 15

看起来字段之间的分隔符是一个空格.因此,您可以用它cut来分割它们:

file=$(echo "${MY_ARR[1]}" | cut -d' ' -f1)
parameter=$(echo "${MY_ARR[1]}" | cut -d' ' -f2-)
Run Code Online (Sandbox Code Playgroud)
  • -f1 表示第一个参数.
  • -f2- 表示第二个参数的所有内容.


Tho*_*hor 5

你可以使用read:

$ read file parameter <<< ${MY_ARR[1]}
$ echo "$file"
./path/path2/name.exe
$ echo "$parameter"
'word1 word2' 'name3,name4,name5'
Run Code Online (Sandbox Code Playgroud)

  • 这是更好的解决方案,因为它不需要多个新进程来完成任务(一个用于命令替换,两个用于管道的任一侧). (3认同)