bash를 사용하여 같은 길이의 두 하위 문자열로 문자열을 분할하는 방법은 무엇입니까?


12

문자열을 두 부분으로 나누고 순차적으로 인쇄하고 싶습니다. 예를 들면 다음과 같습니다.

abcdef

으로

abc
def

간단한 방법이 있습니까, 아니면 문자열 처리가 필요합니까?


수신 문자열이 어떻게 되나요? 변하기 쉬운? Stdin? 다른?
Jeff Schaller

1
변수에서. 아무것도 해결할 수 있기 때문에 실제로 중요하지 않습니다 (stdin 입력을 변수에 넣을 수 있음).
Gabriel Diego

특히 거대 할 수있는 경우 효율성에 중요합니다. 또한 편의상.
Peter Cordes

답변:


16

사용 매개 변수 확장쉘 산술 :

변수의 전반부는 다음과 같습니다.

${var:0:${#var}/2}

변수의 후반은 다음과 같습니다.

${var:${#var}/2}

그래서 당신은 사용할 수 있습니다 :

printf '%s\n' "${var:0:${#var}/2}" "${var:${#var}/2}"

다음 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

답변 주셔서 감사합니다!
Gabriel Diego

간결하고 우아한 솔루션.
Dudi Boy

3
$((...));를 제거 할 수 있습니다 . offlen의 부분 ${var:off:len}치환 이미 산술 표현으로 평가된다. 예 : foo=01234567; echo "${foo:0:${#foo}/2} ${foo:${#foo}/2}". 그것은 문서화 되어 있으며 bash zsh와 동일 ksh93합니다.
mosvy 2016 년

3
참고 : 문자열의 길이가 홀수 인 경우 문자열이 두 부분으로 분할되지만 두 번째 문자는 더 길어집니다.
peterh-복원 모니카

8

split, 여기에 문자열 및 명령 대체를 사용 하십시오.

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

7

다른 awk스크립트는 다음과 같습니다.

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

1
나누기 //ERE/연산자 의 구문 모호성 및 ()선택적인 특수한 경우 length(이러한 구현은 POSIX 호환이 아님) 때문에 mawk 또는 busybox awk에서는 작동하지 않습니다 . 대신 length()또는 length($0)여기를 사용하면 length도움 이 될 것입니다. 당신은 또한 할 수있는 awk 'BEGIN{half = int(length(ARGV[1]) / 2); print substr(ARGV[1], 1, half) ORS substr(ARGV[1], half+1)}' abcdef파이프 및 추가 공정을 저장하고이 문자열이 개행 문자가 포함 된 경우에도 작동 할 것이다.
Stéphane Chazelas

1

파이썬 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.

예를 들어

$ echo abcdef | python3 -c 's = input(); x = len(s) // 2; print(s[:x], s[x:], sep="\n")'
abc
def

문자열 길이가 짝수가 아닌 경우 두 번째 줄은 더 길어집니다. 예 :

$ echo abcdefg | python3 -c 's = input(); x= len(s) // 2; print(s[:x], s[x:], sep="\n")'
abc
defg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.