String Bash-将字符串保存到自定义分隔符后的分隔变量

String Bash-将字符串保存到自定义分隔符后的分隔变量,string,bash,parsing,scripting,String,Bash,Parsing,Scripting,我对Bash还比较陌生,所以请原谅我,但我正在构建一个Bash脚本,它可以接受用户输入命令,该命令可以有很多开关。我需要编写一个函数,从用户提供的命令中提取特定数据 我似乎找不到一种方法来将每个单词拉到“-mode”之后,并将其放入某种数组或列表中 以下是用户输入命令的示例: /home/custom/function/that/accepts/a/billion/switches random_info random_info2 -worker vendor_schmo -switch_o

我对Bash还比较陌生,所以请原谅我,但我正在构建一个Bash脚本,它可以接受用户输入命令,该命令可以有很多开关。我需要编写一个函数,从用户提供的命令中提取特定数据

我似乎找不到一种方法来将每个单词拉到“-mode”之后,并将其放入某种数组或列表中

以下是用户输入命令的示例:

/home/custom/function/that/accepts/a/billion/switches  random_info random_info2 -worker vendor_schmo  -switch_one  -anotherOne  -more_switches  -optionTwo        -mode FOO -mode BAR -mode BAZ -mode BAG -mode DAT -mode RAR
我尝试过摆弄awk-F“-mode”{print$1},但没有成功。任何建议都将不胜感激

以下是提取此信息的脚本片段:

manualRunMain(){
  local command
  manualRunHeaderPrint
  echo
  echo
  echo
  echo
  lineBreakPrint
  read -p "Enter your command here: " command
  sleep .25
  manualRun "$command"
}

manualRun(){
  manualRunHeaderPrint
  jobRunSubHeaderPrint
  pullModeNames "$1"
}

pullModeNames(){

}

您可以在awk中使用
RS
变量,告知在数据进入
-mode
模式时将其拆分为单独的记录:

s='/home/custom/function/that/accepts/a/billion/switches  random_info random_info2 -worker vendor_schmo  -switch_one  -anotherOne  -more_switches  -optionTwo        -mode FOO -mode BAR -mode BAZ -mode BAG -mode DAT -mode RAR'

printf '%s' "$s" | awk -v RS="-mode[[:space:]]*" 'NR>1'
FOO
BAR
BAZ
BAG
DAT
RAR
要填充数组,请执行以下操作:

mapfile -t arr < <(printf '%s' "$s" | awk -v RS="-mode[[:space:]]*" 'NR>1')

# examine array content
declare -p arr
declare -a arr=([0]="FOO" [1]="BAR" [2]="BAZ" [3]="BAG" [4]="DAT" [5]="RAR")

mapfile-t arr<您可以在awk中使用
RS
变量,告知在数据进入
-mode
模式时将数据拆分为单独的记录:

s='/home/custom/function/that/accepts/a/billion/switches  random_info random_info2 -worker vendor_schmo  -switch_one  -anotherOne  -more_switches  -optionTwo        -mode FOO -mode BAR -mode BAZ -mode BAG -mode DAT -mode RAR'

printf '%s' "$s" | awk -v RS="-mode[[:space:]]*" 'NR>1'
FOO
BAR
BAZ
BAG
DAT
RAR
要填充数组,请执行以下操作:

mapfile -t arr < <(printf '%s' "$s" | awk -v RS="-mode[[:space:]]*" 'NR>1')

# examine array content
declare -p arr
declare -a arr=([0]="FOO" [1]="BAR" [2]="BAZ" [3]="BAG" [4]="DAT" [5]="RAR")

mapfile-t arr<我刚刚给出了与@anubhava基本相同的答案,但是使用了GNU grep而不是awk:

$ cmd="... -more_switches  -mode FOO BAR -mode BAZ -mode BAG -mode CAT DAT HAT -mode RAR"
$ mapfile -t modes < <(grep -oP -- '-mode \K.+?(?= -mode|$)' <<<"$cmd")
$ printf "%s\n" "${modes[@]}"
FOO BAR
BAZ
BAG
CAT DAT HAT
RAR
$cmd=“…-更多开关-模式食物条-模式BAZ-模式行李-模式CAT DAT HAT-模式RAR”

$mapfile-t modes<我刚刚给出了与@anubhava基本相同的答案,但是使用了GNU grep而不是awk:

$ cmd="... -more_switches  -mode FOO BAR -mode BAZ -mode BAG -mode CAT DAT HAT -mode RAR"
$ mapfile -t modes < <(grep -oP -- '-mode \K.+?(?= -mode|$)' <<<"$cmd")
$ printf "%s\n" "${modes[@]}"
FOO BAR
BAZ
BAG
CAT DAT HAT
RAR
$cmd=“…-更多开关-模式食物条-模式BAZ-模式行李-模式CAT DAT HAT-模式RAR”


$mapfile-t modes<欢迎来到stack overflow,您能不能也在代码标签中添加预期输出的示例?我想我不需要任何输出,我只需要将每个“-mode”后面的每个单词放入一个数组中。我想这就足够了,我可以从那里开始。一般来说,你应该考虑遵循你的既定目标。您的命令给出的参数列表不是作为字符串传递的,而是作为字符串数组传递的,将其视为字符串意味着您采用了一系列错误(例如,您无法区分
-foo“bar baz”
-foo bar baz
)。(如果您有一个字符串,并且需要以与shell类似的方式将其拆分为字符串列表,这样就可以使用标准工具解析该数组,这本身就是一个相当复杂的问题,答案比
array=($string)复杂得多。)
;也就是说,这是一个在我们的知识库中已经有公认的、规范的答案的问题)。欢迎使用stack overflow,您可以在代码标记中添加示例预期输出吗?我认为我不需要任何输出,我只需要在每个“-模式”后推送每个单词一般来说,你应该考虑遵循给定的实践。命令的参数列表不是作为字符串传递的,而是作为字符串数组传递的,并且对待它就好像字符串意味着你接受一堆错误。(例如,您无法区分
-foo“bar baz”
-foo bar baz
)。(如果您有一个字符串,并且需要以与shell类似的方式将其拆分为字符串列表,这样就可以使用标准工具解析该数组,这本身就是一个相当复杂的问题,答案比
array=($string)复杂得多。)
;也就是说,这是一个在我们的知识库中已经有公认的、规范的答案的问题。)谢谢!这太完美了。我会投票给你,但我还没有这样做的声誉:)请注意,用于填充数组的命令会进行分词和全局扩展,因此如果您有一个参数
-mode'has space'
,它将中断。相反,您可以使用
mapfile
mapfile-tarr<@BenjaminW:
print$1
:这一点很好,但是如果有任何空格,那么即使
print$1
也将只打印第一部分。由于您使用的是
RS
,您不能首先打印
$0
吗?可能必须调整
RS
以容纳空白。类似于
RS=“-mode*”
。顺便说一句,我同意这是对标题中所问问题的最佳答案,但问题文本中给出了预期的用例(命令行解析)让我对这个答案是否符合目的感到不安。谢谢!这太完美了。我会投票给你,但我还没有这样做的声誉:)请注意,用于填充数组的命令会进行分词和全局扩展,因此如果您有一个参数
-mode'has space'
,它将中断。相反,您可以使用
mapfile
mapfile-tarr<@BenjaminW:
print$1
:这一点很好,但是如果有任何空格,那么即使
print$1
也将只打印第一部分。由于您使用的是
RS
,您不能首先打印
$0
吗?可能必须调整
RS
以容纳空白。类似于
RS=“-mode*”
。顺便说一句,我同意这是对标题中所问问题的最佳答案,但问题文本中给出了预期的用例(命令行解析)让我对这个答案是否符合目的感到不安。