按分隔符分割字符串并获取第 N 个元素

按分隔符分割字符串并获取第 N 个元素

我有一个字符串:

one_two_three_four_five

我需要保存变量A值和上面字符串中的two变量Bfour

我正在使用 ksh。

答案1

使用cutwith_作为字段分隔符并获取所需的字段:

A="$(cut -d'_' -f2 <<<'one_two_three_four_five')"
B="$(cut -d'_' -f4 <<<'one_two_three_four_five')"

您还可以使用echoand 管道代替此处的字符串:

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

相关内容