Você pode se livrar do $((...)); a parte offe lena ${var:off:len}substituição já são avaliadas como expressões aritméticas. Exemplo: foo=01234567; echo "${foo:0:${#foo}/2} ${foo:${#foo}/2}". Isso está documentado, e é o mesmo em zshe ksh93como em bash.
mosvy
3
Nota: Se o comprimento da string for ímpar, isso ainda será dividido em duas partes, mas a segunda será um caractere mais longo.
peterh - Restabelece Monica
8
Usando split, aqui strings e substituição de comando:
Observe que ele não funciona com o mawk ou o busybox awk por causa da ambiguidade de sintaxe da divisão /e do /ERE/operador e pelo caso especial de ()ser opcional length(ainda essas implementações não são compatíveis com POSIX nesse caso). Usar length()ou length($0)aqui em vez de lengthajudaria para aqueles. Você também pode fazer o awk 'BEGIN{half = int(length(ARGV[1]) / 2); print substr(ARGV[1], 1, half) ORS substr(ARGV[1], half+1)}' abcdefque salvaria o pipe e o processo extra, além de fazê-lo funcionar, mesmo que a string contenha caracteres de nova linha.
Stéphane Chazelas
1
Python 3
s = input()# Take one line of input from stdin.
x = len(s)//2# Get middle of string. "//" is floor division
print(s[:x], s[x:], sep="\n")# Print "s" up to "x", then "s" past "x", joined on newlines.
Respostas:
Usando expansão de parâmetros e aritmética de shell :
A primeira metade da variável será:
A segunda metade da variável será:
então você pode usar:
Você também pode usar o seguinte comando awk:
fonte
$((...))
; a parteoff
elen
a${var:off:len}
substituição já são avaliadas como expressões aritméticas. Exemplo:foo=01234567; echo "${foo:0:${#foo}/2} ${foo:${#foo}/2}"
. Isso está documentado, e é o mesmo emzsh
eksh93
como em bash.Usando
split
, aqui strings e substituição de comando:fonte
Outro
awk
script pode ser:fonte
/
e do/ERE/
operador e pelo caso especial de()
ser opcionallength
(ainda essas implementações não são compatíveis com POSIX nesse caso). Usarlength()
oulength($0)
aqui em vez delength
ajudaria para aqueles. Você também pode fazer oawk 'BEGIN{half = int(length(ARGV[1]) / 2); print substr(ARGV[1], 1, half) ORS substr(ARGV[1], half+1)}' abcdef
que salvaria o pipe e o processo extra, além de fazê-lo funcionar, mesmo que a string contenha caracteres de nova linha.Python 3
Por exemplo,
Se o comprimento da string não for um número par, a segunda linha será mais longa. Por exemplo
fonte