首页 > 解决方案 > 如何在bash中单词的每五个字符后添加一个连字符

问题描述

给定"ABCDEFGHIJKLMOPQRSTUVWXY"

如何实现这一结果?"ABCDE-FGHIJ-KLMNO-PQRST-UVWXY"

标签: bashawksed

解决方案


使用 sed,您可以先-在每 5 个字符后添加一个,然后删除行尾的尾随-

$ sed -E 's/.{5}/&-/g; s/-$//' <<<"ABCDEFGHIJKLMNOPQRSTUVWXY"
ABCDE-FGHIJ-KLMNO-PQRST-UVWXY

在扩展 ( -E) 模式下:

  • .{5}匹配任意 5 个字符
  • &-替换为整个匹配项(5 个字符)加上-

然后第二个替换命令匹配-行尾 ( $) 并替换为空。


使用 GNU awk,一个选项是用于FPAT定义将行解释为一系列字段的方式,然后-在每个字段之间添加:

$ awk -v FPAT='.{5}' -v OFS='-' '{ $1 = $1 } 1' <<<"ABCDEFGHIJKLMNOPQRSTUVWXY"
ABCDE-FGHIJ-KLMNO-PQRST-UVWXY

字段模式FPAT定义为任意 5 个字符,输出字段分隔符OFS定义为-. $1 = $1“触及”每一行,导致它被重新格式化(没有这部分,什么都不会发生)。是导致打印每一行1的最短真条件。


在 bash 中做到这一点也不是太难:

#!/bin/bash

input="ABCDEFGHIJKLMNOPQRSTUVWXY"
parts=()
# build an array from slices of length 5
for (( i = 0; i < ${#input}; i += 5 )) do
  parts+=( "${input:i:5}" )
done

# join the array on IFS (use a subshell to avoid modifying IFS for rest of script)
( IFS=-; echo "${parts[*]}" )

推荐阅读