首页 > 解决方案 > 如何将线转换为驼峰式?

问题描述

这会在模式匹配后选择单行上的所有文本,并使用非字母数字作为分隔符将其转换为驼峰式大小写,删除结果字符串开头和结尾的空格,(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

标签: bashshellsed

解决方案


要回答您的第一个问题,请更改[^[: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)。

推荐阅读