String Bash-将字符串保存到自定义分隔符后的分隔变量
我对Bash还比较陌生,所以请原谅我,但我正在构建一个Bash脚本,它可以接受用户输入命令,该命令可以有很多开关。我需要编写一个函数,从用户提供的命令中提取特定数据 我似乎找不到一种方法来将每个单词拉到“-mode”之后,并将其放入某种数组或列表中 以下是用户输入命令的示例: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
/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*”
。顺便说一句,我同意这是对标题中所问问题的最佳答案,但问题文本中给出了预期的用例(命令行解析)让我对这个答案是否符合目的感到不安。