이 코드 줄은 일곱 번째 문자 대신 첫 번째 문자에서 시작한다는 점을 제외하면 정확히 그 일을 합니다.
$ 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