如何使用bash将一个字符串拆分为两个相同长度的子字符串?

Gab*_*ego 12 bash string

我想将一个字符串分成两半并按顺序打印它们。例如:

abcdef
Run Code Online (Sandbox Code Playgroud)

进入

abc
def
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法可以做到,或者需要一些字符串处理?

jes*_*e_b 17

使用参数扩展shell 算法

变量的前半部分将是:

${var:0:${#var}/2}
Run Code Online (Sandbox Code Playgroud)

变量的后半部分将是:

${var:${#var}/2}
Run Code Online (Sandbox Code Playgroud)

所以你可以使用:

printf '%s\n' "${var:0:${#var}/2}" "${var:${#var}/2}"
Run Code Online (Sandbox Code Playgroud)

您还可以使用以下 awk 命令:

awk 'BEGIN{FS=""}{for(i=1;i<=NF/2;i++)printf $i}{printf "\n"}{for(i=NF/2+1;i<=NF;i++){printf $i}{printf "\n"}}'
Run Code Online (Sandbox Code Playgroud)
$ echo abcdef | awk 'BEGIN{FS=""}{for(i=1;i<=NF/2;i++)printf $i}{printf "\n"}{for(i=NF/2+1;i<=NF;i++){printf $i}{printf "\n"}}'
abc
def
Run Code Online (Sandbox Code Playgroud)

  • 你可以去掉`$((...))`; `${var:off:len}` 替换的 `off` 和 `len` 部分已经被评估为算术表达式。示例:`foo=01234567; echo "${foo:0:${#foo}/2} ${foo:${#foo}/2}"`。这是记录在案的,它在`zsh`和`ksh93`中与在bash中相同。 (3认同)
  • 注意:如果字符串的长度是奇数,这仍然会将它分成两部分,但第二部分会更长一个字符。 (3认同)

Fre*_*ddy 8

split在这里使用字符串和命令替换:

var=abcdef
printf '%s\n' "$(split -n1/2 <<<$var)" "$(split -n2/2 <<<$var)"
Run Code Online (Sandbox Code Playgroud)


Dud*_*Boy 7

另一个awk脚本可以是:

echo abcdef | awk '{print substr($0,1,length/2); print substr($0,length/2+1)}'
Run Code Online (Sandbox Code Playgroud)