regex - 如何在shell中的2个字符之间添加逗号
问题描述
在输入字符串示例之后,我输入了一个带有 1 个大写字母的字符串或一个带有 2 个大写字母的字符串:
AB
AN
FG
K
M
我想执行一个shell命令/函数,将输入字符串转换为用逗号分隔的2个小写字母“,”(如果输入是2个大写字母)或1个小写字母(如果输入是1个大写字母)这
上述示例的输出
a,b
a,n
f,g
k
m
我试过这个
(echo -n "${s:0:1}" && [ "${s,1:1}" != "" ] && echo -n ",${s:1:1}") | tr [A-Z] [a-z]
但我认为 sed / awk 有最简单的解决方案
解决方案
你可以使用这个 awk:
awk 'BEGIN{FS=""; OFS=","} {$0 = tolower($0); $1=$1} 1' file
a,b
a,n
f,g
k
m
细节:
FS=""
:使用空字段分隔符将每个字符拆分为单独的字段OFS=","
: 使用输出字段分隔符作为,
$0 = tolower($0)
: 小写所有大写字符$1=$1
: 强制awk
使用OFS
值重写每条记录1
:打印每条记录
替代解决方案:
如果您awk
不支持FS=""
(空字段分隔符),请使用此解决方案:
awk -v OFS=, '{$0 = tolower($0); gsub(/[a-z]/, "&,"); sub(/,$/, "")} 1' file
推荐阅读
- java - 当我使用 google drive api 搜索特定文件时收到错误消息“消息”:“无效值”
- vue.js - 如何正确使用 Vue.set()?
- angular - 当 selectedIndex 高于实际选项卡数时,材质选项卡更改为最后一个选项卡
- android - 我想用另一个片段替换一个片段,但这些应该基于在其他片段(主要片段)中单击的按钮发生
- postgresql - pgjdbc中的loginTimeout、connectTimeout和socketTimeout有什么区别
- azure - 在 Azure AD 中,如何通过 PowerShell(如 Set-AzureADUser 和 Get-AzureADUser)设置和读取用户的主邮箱?
- javascript - 输出奇怪的主任务和微任务的执行顺序
- azure-web-app-service - 在一个应用服务计划下托管多个网站的 Azure 部署槽
- javascript - 为什么我的图像滑块上的 background-size 或 background-repeat 属性不起作用?
- javascript - 我有一个 JS 函数,它应该根据 DropDownListFor 中的事件更改来更改 td 的 innerHTML,但仅适用于初始加载