Puedes deshacerte de la $((...)); La parte offy lenla ${var:off:len}sustitución ya se evalúan como expresiones aritméticas. Ejemplo: foo=01234567; echo "${foo:0:${#foo}/2} ${foo:${#foo}/2}". Eso está documentado, y es lo mismo en zshy ksh93como en bash.
mosvy
3
Nota: Si la longitud de la cadena es impar, esto aún la dividirá en dos partes, pero la segunda será un carácter más largo.
peterh - Restablece a Monica
8
Usando split, aquí cadenas y sustitución de comandos:
Tenga en cuenta que no funciona con mawk u busybox awk debido a la ambigüedad de sintaxis de la división /y el /ERE/operador, y el caso especial de ()ser opcional para length(aún esas implementaciones no son compatibles con POSIX en ese caso). Usar length()o length($0)aquí en lugar de lengthayudaría a aquellos. También podría hacer awk 'BEGIN{half = int(length(ARGV[1]) / 2); print substr(ARGV[1], 1, half) ORS substr(ARGV[1], half+1)}' abcdeflo que ahorraría la tubería y el proceso adicional y lo haría funcionar incluso si la cadena contiene caracteres de nueva línea.
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.
Respuestas:
Usando la expansión de parámetros y la aritmética de shell :
La primera mitad de la variable será:
La segunda mitad de la variable será:
para que puedas usar:
También puede usar el siguiente comando awk:
fuente
$((...))
; La parteoff
ylen
la${var:off:len}
sustitución ya se evalúan como expresiones aritméticas. Ejemplo:foo=01234567; echo "${foo:0:${#foo}/2} ${foo:${#foo}/2}"
. Eso está documentado, y es lo mismo enzsh
yksh93
como en bash.Usando
split
, aquí cadenas y sustitución de comandos:fuente
Otro
awk
script puede ser:fuente
/
y el/ERE/
operador, y el caso especial de()
ser opcional paralength
(aún esas implementaciones no son compatibles con POSIX en ese caso). Usarlength()
olength($0)
aquí en lugar delength
ayudaría a aquellos. También podría hacerawk 'BEGIN{half = int(length(ARGV[1]) / 2); print substr(ARGV[1], 1, half) ORS substr(ARGV[1], half+1)}' abcdef
lo que ahorraría la tubería y el proceso adicional y lo haría funcionar incluso si la cadena contiene caracteres de nueva línea.Python 3
Por ejemplo,
Si la longitud de la cadena no es un número par, la segunda línea será más larga. P.ej
fuente