如何在bash中每五个字符后添加连字符

如何在bash中每五个字符后添加连字符,bash,awk,sed,Bash,Awk,Sed,给定 如何实现这一结果?ABCDE-FGHIJ-KLMNO-PQRST-UVWXY请尝试以下内容 echo "ABCDEFGHIJKLMOPQRSTUVWXY" | sed 's/...../&-/g;s/-$//' 使用sed,您可以先在每5个字符后添加一个-a,然后在行尾删除尾随-a: $ sed -E 's/.{5}/&-/g; s/-$//' <<<"ABCDEFGHIJKLMNOPQRSTUVWXY" ABCDE-FGHIJ-KLMNO-PQRST-

给定


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

请尝试以下内容

echo "ABCDEFGHIJKLMOPQRSTUVWXY" | sed 's/...../&-/g;s/-$//'

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

$ sed -E 's/.{5}/&-/g; s/-$//' <<<"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[*]}" )

仅针对字母的简单解决方案如下:

sed -E 's/[A-Z]{4}./&-/g' file.txt
输出将是:

ABCDE-FGHIJ-KLMOP-QRSTU-VWXY
如果您想让它们包含更多大写字母,只需执行以下操作:

sed -E 's/[A-Za-z]{4}./&-/g' file.txt
试试这个

#!/bin/bash

s="ABCDEFGHIJKLMNOPQRSTUVWXY"
a=($(echo ${s} | grep -o .))

o=""
i=0
while [[ ${i} -lt ${#a[@]} ]]; do
    o="${o}${a[${i}]}"
    (( i++ ))
    [[ $(( i % 5 )) -eq 0 ]] && [[ ${i} -ne ${#a[@]} ]] && o="${o}-"
done
echo ${o}

exit 0
另一种带有折叠/粘贴的溶液


这可能适用于GNU sed:

sed 's/.\{5\}\B/&-/g' file
每五个字符插入一个连字符,只要第五个字符在单词中。

还有另一种选择

perl -pe 's/(.{5})(?=.)/$1-/g' file

匹配5个字符,后跟另一个字符以避免尾部连字符问题

您尝试了什么,哪些不适合您?我仍然不知道如何使用awk或SED来学习awk获取Arnold Robbins的《有效的awk编程》第四版。您不需要一本书来学习如何将sed用于严格意义上的s/old/new。如果您使用的sed构造不是带-n的s、g和p,那么您使用的工具是错误的。@EdMorton谢谢您的参考,我会读到的!N在给定字符串中缺失,但在带连字符的版本中神奇地出现!加上我身边的1,虽然这是可行的,但它令人难以置信地复杂,可能需要一个解释;理解。很抱歉,最初没有添加评论:以a开头的行正在将字符串s转换为数组。以o开头的行正在初始化空字符串。o变量将包含输出。以i开头的行正在初始化索引变量。这将在while循环中用于遍历数组中的所有元素。数组的索引从0开始。while循环条件只是确保数组中的所有元素都已被处理。${a[@]}返回数组中的元素数。循环中的第一行是附加到oThe的,i++是递增索引变量。下一行是进行模数运算。如果i是5的倍数,并且它不在数组的末尾,则在输出中附加一个破折号。循环处理完毕后,打印出结果输出字符串。@Lewis您应该在答案中添加解释,而不是在注释中添加解释。@PesaThe准确无误,先生
sed 's/.\{5\}\B/&-/g' file
perl -pe 's/(.{5})(?=.)/$1-/g' file