目标:从整数生成路径。 我需要分割固定长度的字符串(在这种情况下为2个字符),然后用分隔符粘贴这些片段。示例:123456 => 12/34 / 56,12345 => 12/34/5。
我找到了一个sed的解决方案:
sed 's/\(..\)/\1\//g'
但是我不确定它真的很快,因为我真的不是在搜索字符串内容的任何分析(如果它有任何重要性,它将始终是一个整数),但实际上要将其拆分为长度2(如果原始长度是奇数,则为1。
答案 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