我有一个字符串:
one_two_three_four_five
我需要保存变量A
值和上面字符串中的two
变量B
值four
我正在使用 ksh。
答案1
使用cut
with_
作为字段分隔符并获取所需的字段:
A="$(cut -d'_' -f2 <<<'one_two_three_four_five')"
B="$(cut -d'_' -f4 <<<'one_two_three_four_five')"
您还可以使用echo
and 管道代替此处的字符串:
A="$(echo 'one_two_three_four_five' | cut -d'_' -f2)"
B="$(echo 'one_two_three_four_five' | cut -d'_' -f4)"
例子:
$ s='one_two_three_four_five'
$ A="$(cut -d'_' -f2 <<<"$s")"
$ echo "$A"
two
$ B="$(cut -d'_' -f4 <<<"$s")"
$ echo "$B"
four
请注意,如果$s
包含换行符,则将返回一个多行字符串,其中包含 的每行中的第二个/第四个字段,而不是$s
中的第二个/第四个字段$s
。
答案2
想看到awk
答案,所以这里有一个:
A=$(awk -F_ '{print $2}' <<< 'one_two_three_four_five')
B=$(awk -F_ '{print $4}' <<< 'one_two_three_four_five')
答案3
仅使用 POSIX sh 构造,您可以使用参数替换结构一次解析一个分隔符。请注意,此代码假定存在必要数量的字段,否则最后一个字段将重复。
string='one_two_three_four_five'
remainder="$string"
first="${remainder%%_*}"; remainder="${remainder#*_}"
second="${remainder%%_*}"; remainder="${remainder#*_}"
third="${remainder%%_*}"; remainder="${remainder#*_}"
fourth="${remainder%%_*}"; remainder="${remainder#*_}"
或者,您可以使用不带引号的参数替换通配符扩展残疾人和IFS
设置为分隔符(仅当分隔符是单个非空白字符或任何空白序列是分隔符时才有效)。
string='one_two_three_four_five'
set -f; IFS='_'
set -- $string
second=$2; fourth=$4
set +f; unset IFS
这会破坏位置参数。如果在函数中执行此操作,则只有函数的位置参数受到影响。
对于不包含换行符的字符串,另一种方法是使用read
内置函数。
IFS=_ read -r first second third fourth trail <<'EOF'
one_two_three_four_five
EOF
答案4
您zsh
可以将字符串( on _
)拆分为数组:
non_empty_elements=(${(s:_:)string})
all_elements=("${(@s:_:)string}")
然后通过数组索引访问每个/任何元素:
print -r -- ${all_elements[4]}
请记住zsh
(与大多数其他 shell 一样,但与ksh
/不同bash
)数组索引从 1 开始。
或者直接在一个扩展中:
print -r -- "${${(@s:_:)string}[4]}"
或者使用匿名函数使其元素在其$1
, $2
... 中可用:
(){print -r -- $4} "${(@s:_:)string}"