このコード行は、7番目の文字ではなく最初の文字で始まるという点を除いて、まさにそれを行います。
$ echo 1234567890abcdefghijklmnopqrstuvwxy | sed 's/.\{1,7\}\(.\{0,1\}\)/\1/g'
私が探しているのは
19gow
答え1
実際に必要なものを説明していませんが、目的の出力を取得する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