bash - 如何将线转换为驼峰式?
问题描述
这会在模式匹配后选择单行上的所有文本,并使用非字母数字作为分隔符将其转换为驼峰式大小写,删除结果字符串开头和结尾的空格,(1)如果它有 2 个连续的非字母数字字符,例如下例中的“2”,(2) 有没有办法使用 sed 命令而不是使用来完成所有操作grep, cut, sed and tr
?
$ echo " hello
world
title: this is-the_test string with number 2, to-test CAMEL String
end! " | grep -o 'title:.*' | cut -f2 -d: | sed -r 's/([^[:alnum:]])([0-9a-zA-Z])/\U\2/g' | tr -d ' '
ThisIsTheTestStringWithNumber2,ToTestCAMELString
解决方案
要回答您的第一个问题,请更改[^[:alnum:]]
为[^[:alnum:]]+
马赫一个或多个非铝字符。
您可以将所有命令组合成一个 GNUsed
解决方案,例如
sed -En '/.*title: *(.*[[:alnum:]]).*/{s//\1/;s/([^[:alnum:]]+|^)([0-9a-zA-Z])/\U\2/gp}'
查看在线演示
细节
-En
- POSIX ERE 语法为 (E
) 并且默认行输出被抑制n
/.*title: *(.*[[:alnum:]]).*/
- 匹配一行,title:
在它之后捕获所有字符,直到最后一个 alnum 字符进入第 1 组,并匹配该行的其余部分{s//\1/;s/([^[:alnum:]]+|^)([0-9a-zA-Z])/\U\2/gp}
- 如果该行匹配,s//\1/
- 删除除第 1 组模式以外的所有模式(如上所示)s/([^[:alnum:]]+|^)([0-9a-zA-Z])/\U\2/
- 匹配并捕获字符串的开头或 1+ 个非 alnum 字符到第 1 组(使用([^[:alnum:]]+|^)
),然后将一个 alnum 字符捕获到第 2 组(使用([0-9a-zA-Z])
)并替换为大写的第 2 组内容(使用\U\2
)。
推荐阅读
- python - Pandas:如果满足条件,则将列的值替换为前一行的值
- python - 在 Django 3.0.3 中出现完整性错误,唯一约束使用外键失败
- r - 如何比较 R 中不完全相同的 2 个字符串?
- mysql - MySQL - 搜索 CC 号码
- javascript - 打字稿在循环中传递 obj['key'] 时抛出警告
- python - 得到参数“其他”的类型不正确(预期 spacy.tokens.token.Token,得到 str)
- php - 将 SimpleXMLElement 参数保存到全局变量
- flask - 由于 requirements.txt 错误,无法部署到 heroku
- javascript - 用数字 javascript 对字符串进行排序
- mysql - 如何在 MYSQL Workbench 中同时选择数据库中的所有表?