String 将大字符串拆分为子字符串

String 将大字符串拆分为子字符串,string,bash,shell,String,Bash,Shell,我有一根巨大的绳子,像: ABCDEFGHIJKLM 我想用这种方式将其拆分为长度为5的子字符串: >1 ABCDE >2 BCDEF >3 CDEFG [……] 更新 解决方案: 好的,多亏了你们,我才找到了这么快完成任务的方法!。这是我的解决方案,结合了这里的一些想法: str=“ABCDEFGHIJKLMNOP” splitfive(){echo$1 | cut-c$2-| sed-r's/(.{5})/\1\n/g'} 对于((i=0;i 从$position处的$string中提取子字

我有一根巨大的绳子,像:

ABCDEFGHIJKLM

我想用这种方式将其拆分为长度为5的子字符串:

>1
ABCDE
>2
BCDEF
>3
CDEFG

[……]

更新

解决方案:
好的,多亏了你们,我才找到了这么快完成任务的方法!。这是我的解决方案,结合了这里的一些想法:

str=“ABCDEFGHIJKLMNOP”
splitfive(){echo$1 | cut-c$2-| sed-r's/(.{5})/\1\n/g'}
对于((i=0;i 从$position处的$string中提取子字符串的$length字符

stringZ=abcABC123ABCabc
#       0123456789.....
#       0-based indexing.

echo ${stringZ:0}                            # abcABC123ABCabc
echo ${stringZ:1}                            # bcABC123ABCabc
echo ${stringZ:7}                            # 23ABCabc

echo ${stringZ:0:5}                          # abcAB
                                             # Five characters of substring.
然后使用循环遍历并向位置添加1,以提取长度为5的每个子字符串

for i in seq 0 ${#stringZ}; do
    echo ${stringZ:$i:5}
done
全部来自

str=ABCDEFGHIJKLM
splitfive(){echo“${1:$2:5}”;}
对于((i=0;i<${str};i++),请拆分五个“$str”$i;完成
或者,也许你想用结果做一些更明智的事情

#!/usr/bin/env bash

splitstr(){
    printf '%s\n' "${1:$2:$3}"
}

n=$1
offset=$2

declare -a by_fives

while IFS= read -r str ; do
    for (( i=0 ; i < ${#str} ; i++ )) ; do
            by_fives=("${by_fives[@]}" "$(splitstr "$str" $i $n)")
    done
done

echo ${by_fives[$offset]}
!/usr/bin/env bash
splitstr(){
printf'%s\n'${1:$2:$3}
}
n=1美元
偏移量=$2
声明-a乘5
而IFS=read-r str;do
for((i=0;i<${str};i++)do
by_fives=(“${by_fives[@]}”“$(splitstr“$str”$i$n)”)
完成
完成
echo${by_fives[$offset]}
然后叫它

$ split-by 5 2 <<<"ABCDEFGHIJKLM"
CDEFG

$split by 5 2sed可以一次完成:

kent$  echo "abcdefghijklmnopqr"|sed -r 's/(.{5})/\1 /g'
abcde fghij klmno pqr

根据您的需要:

kent$  echo "abcdefghijklmnopqr"|sed -r 's/(.{5})/\1\n/g' 
abcde
fghij
klmno
pqr
更新

我认为这只是简单的分割字符串问题,没有仔细阅读问题。现在它应该提供您需要的:

还有一次,但这次是awk:

kent$  echo "abcdefghijklmnopqr"|awk '{while(length($0)>=5){print substr($0,1,5);gsub(/^./,"")}}'

abcde
bcdef
cdefg
defgh
efghi
fghij
ghijk
hijkl
ijklm
jklmn
klmno
lmnop
mnopq
nopqr
塞德会这么做吗

$ sed 's/\(.....\)/\1\n/g' < filecontaininghugestring
$sed's/\(……\)/\1\n/g'
…或使用
split
命令:

$ ls

$ echo "abcdefghijklmnopqr" | split -b5

$ ls
xaa  xab  xac  xad

$ cat xaa
abcde
split
也对文件进行操作…

在bash中:

s=ABCDEFGHIJ
for (( i=0; i < ${#s}-4; i++ )); do 
  printf ">%d\n%s\n" $((i+1)) ${s:$i:5}
done
sed可以做到:

 sed -nr ':a;h;s/(.{5}).*/\1/p;g;s/.//;ta;' <<<"ABCDEFGHIJKLM" | # split string
     sed '=' | sed '1~2s/^/>/' # add line numbers and insert '>'

sed-nr':a;h;s/(.{5})。*/\1/p;g;s//;ta;“您可以使用
cut
并指定
字符,而不是
字段,然后将输出分隔符更改为您需要的任何字符,如新行

echo "ABCDEFGHIJKLMNOP" | cut --output-delimiter=$'\n' -c1-5,6-10,11-15
输出

ABCDE
FGHIJ
KLMNO
ABCDE:FGHIJ:KLMNO

输出

ABCDE
FGHIJ
KLMNO
ABCDE:FGHIJ:KLMNO

fold-w5
应该可以

$ echo "ABCDEFGHIJKLMNOPQRSTUVWXYZ" | fold -w5
ABCDE
FGHIJ
KLMNO
PQRST
UVWXY
Z

干杯!

谢谢!您的第一个想法还可以,但对我来说速度非常慢…我有非常大的字符串-10^8个字符…所以将其划分为子字符串需要很多时间…@didymos:这取决于您实际在做什么,以及您是否要处理每个集合,找到特定的偏移量,或者您有什么。您的目标是什么?{0${#stringZ}}将被扩展为一个文本“{1..15}”而不是“1 2 3 4..15”。无法确切地找出原因,我认为嵌套的花括号是问题所在。但是,使用“for I in
seq 0${#stringZ}
”解决它很好。这个循环没有像预期的那样工作。嗯,我不知道为什么,但我只得到abcde,其余的没有打印。你的awk版本是什么?(awk--版本)它应该可以与gawk一起使用。尝试用gawk替换awk。或者如果您使用的是Sun unix设备,则使用nawk。谢谢,gawk可以正常工作,但是我的大字符串仍然会变慢-但是我正在努力加快速度
sed's/…../&\n/g'filename
就足够了,但无法解决问题(还需要理解
\n
,这不是所有的
sed
实现都能做到的)。请接受其中一个答案为正确答案,或者用你自己的解决方案回答这篇文章并接受这个答案。你的
splitfive
可能更有效。没有必要用管道切割,在bash中你可以说
cut-c“$2”-您的sed表达式也可以改进为
sed's/…../&\n/g'
,它的执行速度大约是sed的两倍。
echo "ABCDEFGHIJKLMNOP" | cut --output-delimiter=$':' -c1-5,6-10,11-15 
ABCDE:FGHIJ:KLMNO
$ echo "ABCDEFGHIJKLMNOPQRSTUVWXYZ" | fold -w5
ABCDE
FGHIJ
KLMNO
PQRST
UVWXY
Z