使用sed将字符串拆分为固定大小的片段

时间:2018-04-30 07:16:56

标签: bash sed

我有一个问题 - 我试图将存储为固定大小的变量拆分为5个字符,并在每个5.字母后面添加一个“%”,其中包含:

echo "$d" | sed 's/.\{5\}/&%/g'

如果$d中存储的变量为HELLOWOLRD123

,那么这就是我的意思
HELLO%WORLD%123

如何自动填写%%,以便将固定大小保持为5?

所以我的输出是HELLO%WOLRD%123%%%

4 个答案:

答案 0 :(得分:3)

如果perl没问题

$ echo 'HELLOWOLRD123' | perl -pe 's/.{1,5}/$& . "%" x (6-length($&))/ge'
HELLO%WOLRD%123%%%
  • .{1,5}贪婪匹配1到5个字符
  • e此修饰符允许我们在替换部分
  • 中使用Perl代码
  • $&匹配的字符串
  • .字符串连接
  • "%" x (6-length($&))此处x是字符串重复运算符

答案 1 :(得分:2)

一个在awk中:

$ echo HELLOWOLRD123 | 
  awk '{gsub(/.{1,5}/,"&%");while(length($0)%6)sub(/$/,"%")}1'
HELLO%WOLRD%123%%%

解释一下:

$ echo HELLOWOLRD123 | 
  awk '{
      gsub(/.{1,5}/,"&%")   # add % after every 5 chars
      while(length($0)%6)   # while length of string mod 6 is not 0
          sub(/$/,"%")      # add a & to it
  }1'
HELLO%WOLRD%123%%%

答案 2 :(得分:1)

你去了:

echo $(echo -n "$d"; printf "%`echo $(((5 - (${#d} % 5)) % 5))`s" | tr ' ' '%') | sed 's/.\{5\}/&%/g'

编辑:

适用于Mac(不支持echo -n

echo $(printf "$d"; printf "%`echo $(((5 - (${#d} % 5)) % 5))`s" | tr ' ' '%') | sed 's/.\{5\}/&%/g'

答案 3 :(得分:1)

使用sed

echo 'HELLOWOLRD123' | sed -E '
s/(.{5})/&%/g
s/%...$/&%%%/
t
s/%..$/&%%%%/
t
s/%.$/&%%%%%/'

或循环

echo 'HELLOWOLRD123' | sed -E '
s/(.{5})/&%/g
/%$/b
:A
/%.{6}$/!{
  s/$/#/
  bA
}
:B
  s/(.*%[^#]*)#(.*$)/\1%\2/
  tB'