문자열의 N번째 문자를 모두 인쇄하는 방법은 무엇입니까?

문자열의 N번째 문자를 모두 인쇄하는 방법은 무엇입니까?

이 코드 줄은 일곱 번째 문자 대신 첫 번째 문자에서 시작한다는 점을 제외하면 정확히 그 일을 합니다.

$ echo 1234567890abcdefghijklmnopqrstuvwxy | sed 's/.\{1,7\}\(.\{0,1\}\)/\1/g'

내가 찾고 있는 것은

19gow

답변1

실제로 필요한 것이 무엇인지 설명하지 않았지만 원하는 출력을 얻는 한 가지 방법은 8자마다 선택하는 것 입니다 . 이 같은:

$ echo 1234567890abcdefghijklmnopqrstuvwxy | sed -E 's/(.).{0,7}/\1/g'
19gow

이 교체는 임의의 문자( )를 찾아서 "캡처"한 (.)다음 해당 문자와 ​​다음 7자(남은 문자가 7자 미만인 경우 그 이하)를 자신의 문자로 바꿉니다. 사실상 이렇게 하면 8자를 제외한 모든 문자가 제거됩니다 .

답변2

그리고 zsh:

$ set -o extendedglob # best in ~/.zshrc
$ string=1234567890abcdefghijklmnopqrstuvwxy
$ print -r -- ${string//(#b)(?)?(#c,7)/$match[1]}
19gow

그리고 ksh93:

$ string=1234567890abcdefghijklmnopqrstuvwxy
$ print -r -- "${string//@(?){,7}(?)/\1}"
19gow

bash, ksh93 및 ksh의 확장된 glob 연산자 중 일부에서 zsh복사된 것입니다 . 여기에는 대체 또는 역참조의 1이 포함되지 않습니다.${var//pattern/replacement}@(...){x,y}(...)

$string이는 포함된 문자, 심지어 개행 문자에 관계없이 작동해야 합니다.

POSIX에 해당:

awk '
  BEGIN {
    len = length(string = ARGV[1])
    for (i = 1; i <= len; i += 8) result = result substr(string, i, 1)
    print result
  }' "$string"

답변3

echo 1234567890abcdefghijklmnopqrstuvwxy | sed 's/\(.\{0,1\}\).\{1,7\}/\1/g'
19gow

원본 작품은 이렇습니다.

s/               substitute
.\{1,7\}         upto 7 characters
\(.\{0,1\}\)     and then the next in a capture
/                replace by
\1               that what was captured
/g               globally, so as many times as possible

따라서 캡처 그룹을 끝이 아닌 앞쪽으로 이동하는 것이 바로 귀하가 요청한 것입니다.

s/               substitute
\(.\{0,1\}\)     capture the first character
.\{1,7\}         match upto 7 characters
/                replace by
\1               that what was captured
/g               globally, so as many times as possible

답변4

awk를 사용하세요:

str="1234567890abcdefghijklmnopqrstuvwxy"
awk '{for (i=1;i<=length;i=i+8) printf substr($0,i,1); printf "\n"}' <<< "$str"
19gow

관련 정보