bash - 如何在bash中单词的每五个字符后添加一个连字符
问题描述
给定"ABCDEFGHIJKLMOPQRSTUVWXY"
如何实现这一结果?"ABCDE-FGHIJ-KLMNO-PQRST-UVWXY"
解决方案
使用 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[*]}" )
推荐阅读
- java - Spring Boot v2.1.0.RELEASE - 没有名为“entityManagerFactory”的bean可用
- javascript - 窗口调整大小不应影响角度 8 中的打印屏幕内容
- c# - 性能建议中的可空类型装箱
- neo4j - 为 neo4j-desktop-1.3.11-x86_64.AppImage 禁用全屏
- python - 如何像在 MATLAB 上一样在 Python 中的矩阵中存储矩阵?
- javascript - React Custom component is not getting rendered as expected
- jquery - 如何使用 jquery 为表中的每个不同 ID 选择第一行?
- python - Python - 访问另一个类中的类属性,这不是它的孩子
- html - 作为前端开发人员使用模板
- javascript - 使用“babel-plugin-module-resolver”配置自定义“根”目录?