在bash中分割字符串的最快方法

时间:2018-01-18 13:38:32

标签: string bash sed

目标:从整数生成路径。 我需要分割固定长度的字符串(在这种情况下为2个字符),然后用分隔符粘贴这些片段。示例:123456 => 12/34 / 56,12345 => 12/34/5。

我找到了一个sed的解决方案:

sed 's/\(..\)/\1\//g'

但是我不确定它真的很快,因为我真的不是在搜索字符串内容的任何分析(如果它有任何重要性,它将始终是一个整数),但实际上要将其拆分为长度2(如果原始长度是奇数,则为1。

4 个答案:

答案 0 :(得分:3)

bash扩展可以做substring

while (list ($key, $val) = each ($myArray) ) echo $val['email_do_convidado'][$key]; 

使用/

手动加入
var=123456
echo "${var:0:2}"  # 2 first char
echo "${var:2:2}"  # next two
echo "${var:4:2}"  # etc.

答案 1 :(得分:2)

使用参数替换。 ${var:position:length}提取子字符串,${#var}返回值的长度,${var%final}从值的末尾删除“final”。在循环中运行未知长度的字符串:

#!/bin/bash
for s in 123456 1234567 ; do
    o=""
    for (( pos=0 ; pos<${#s} ; pos+=2 )) ; do
        o+=${s:pos:2}/
    done
    o=${o%/}
    echo "$o"
done

答案 2 :(得分:1)

TL; DR

sed足够快。

如果我们谈论速度,那就检查吧。 我认为sed是缩短的解决方案,但作为示例,我将采用@ choroba的shell脚本:

$ wc -l hugefile 
10877493 hugefile

桑达:

sed 's/\(..\)/\1\//g' hugefile

输出:

real    0m25.432s
user    0m8.731s
sys 0m10.123s

脚本:

#!/bin/bash
while IFS='' read -r s ; do
    o=""
    for (( pos=0 ; pos<${#s} ; pos+=2 )) ; do
        o+=${s:pos:2}/
    done
    o=${o%/}
    echo "$o"
done < hugefile

工作很长时间,我已经打断了它:

real    1m19.480s
user    1m14.795s
sys 0m4.683s

所以在我的PC上英特尔(R)Core(TM)i5-7500 CPU @ 3.40GHz,MemTotal:16324532 kB,sed每秒大约426568(接近50万个)字符串修改。好像足够快

答案 3 :(得分:0)

您可以使用fold命令将字符串拆分为元素,将元素读入包含readarray的数组并处理替换,然后使用IFS插入字段分隔符:

$ var=123456
$ readarray -t arr < <(fold -w2 <<< "$var")
$ (IFS=/; echo "${arr[*]}")
12/34/56

我将最后一个命令放在子shell中,因此对IFS的更改不会持久。

请注意,此处[*]语法 ,或IFS不能用作输出分隔符,即通常首选[@]不会工作。

readarray及其同义词mapfile需要Bash 4.0或更高版本。

这也适用于奇数个元素:

$ var=12345
$ readarray -t arr < <(fold -w2 <<< "$var")
$ (IFS=/; echo "${arr[*]}")
12/34/5