文字列のN番目の文字をすべて印刷するには?

文字列のN番目の文字をすべて印刷するには?

このコード行は、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

関連情報