Chciałbym podzielić ciąg na dwie połówki i wydrukować je sekwencyjnie. Na przykład:
abcdef
w
abc
def
Czy istnieje prosty sposób, aby to zrobić, czy też wymaga przetworzenia ciągu?
Chciałbym podzielić ciąg na dwie połówki i wydrukować je sekwencyjnie. Na przykład:
abcdef
w
abc
def
Czy istnieje prosty sposób, aby to zrobić, czy też wymaga przetworzenia ciągu?
Odpowiedzi:
Używanie rozszerzania parametrów i arytmetyki powłoki :
Pierwsza połowa zmiennej będzie:
${var:0:${#var}/2}
Druga połowa zmiennej będzie:
${var:${#var}/2}
więc możesz użyć:
printf '%s\n' "${var:0:${#var}/2}" "${var:${#var}/2}"
Możesz także użyć następującego polecenia 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"}}'
$ 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
$((...))
; off
i len
część ${var:off:len}
zastąpienia już ocenić jako wyrażeń arytmetycznych. Przykład: foo=01234567; echo "${foo:0:${#foo}/2} ${foo:${#foo}/2}"
. Który jest udokumentowany, a to samo w zsh
i ksh93
jak w bashu.
Innym awk
skryptem może być:
echo abcdef | awk '{print substr($0,1,length/2); print substr($0,length/2+1)}'
/
i /ERE/
operatora oraz szczególny przypadek ()
opcjonalności length
(wciąż te implementacje nie są w tym przypadku zgodne z POSIX). Użycie length()
lub length($0)
tutaj zamiast length
pomógłoby im. Możesz także zrobić to, awk 'BEGIN{half = int(length(ARGV[1]) / 2); print substr(ARGV[1], 1, half) ORS substr(ARGV[1], half+1)}' abcdef
co oszczędziłoby potok i dodatkowy proces i sprawiłoby, że działało, nawet jeśli ciąg znaków zawiera znaki nowej linii.
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.
Na przykład,
$ echo abcdef | python3 -c 's = input(); x = len(s) // 2; print(s[:x], s[x:], sep="\n")'
abc
def
Jeśli długość łańcucha nie jest liczbą parzystą, druga linia będzie dłuższa. Na przykład
$ echo abcdefg | python3 -c 's = input(); x= len(s) // 2; print(s[:x], s[x:], sep="\n")'
abc
defg